Goal: track Alpha Diversity and Proportionality over samples and establish sample ordering

Installation

# devtools::install_github("tpq/propr")
Warning messages:
1: In if (charToRaw(x) < 20) paste("\\u", toupper(format(as.hexmode(as.integer(charToRaw(x))),  :
  the condition has length > 1 and only the first element will be used
2: In if (charToRaw(x) < 20) paste("\\u", toupper(format(as.hexmode(as.integer(charToRaw(x))),  :
  the condition has length > 1 and only the first element will be used
3: In if (charToRaw(x) < 20) paste("\\u", toupper(format(as.hexmode(as.integer(charToRaw(x))),  :
  the condition has length > 1 and only the first element will be used
4: In if (charToRaw(x) < 20) paste("\\u", toupper(format(as.hexmode(as.integer(charToRaw(x))),  :
  the condition has length > 1 and only the first element will be used
5: In if (charToRaw(x) < 20) paste("\\u", toupper(format(as.hexmode(as.integer(charToRaw(x))),  :
  the condition has length > 1 and only the first element will be used
6: In if (charToRaw(x) < 20) paste("\\u", toupper(format(as.hexmode(as.integer(charToRaw(x))),  :
  the condition has length > 1 and only the first element will be used
7: In if (charToRaw(x) < 20) paste("\\u", toupper(format(as.hexmode(as.integer(charToRaw(x))),  :
  the condition has length > 1 and only the first element will be used
# install.packages('ggdendro')
# devtools::install_github("jrnold/ggthemes")
# install.packages("ggthemes") # has tableau_tableau20 color palette

Loading Required Packages

library("ggplot2"); packageVersion("ggplot2") # plotting
[1] ‘3.3.5’
library("tidyverse"); packageVersion("tidyverse") # util              
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.1 ──
✓ tibble  3.1.6     ✓ dplyr   1.0.7
✓ tidyr   1.1.4     ✓ stringr 1.4.0
✓ readr   2.1.1     ✓ forcats 0.5.1
✓ purrr   0.3.4     
── Conflicts ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter()   masks stats::filter()
x dplyr::lag()      masks stats::lag()
x purrr::simplify() masks propr::simplify()
[1] ‘1.3.1’
library("dplyr"); packageVersion("dplyr") # util
[1] ‘1.0.7’
library("phyloseq"); packageVersion("phyloseq") # data object                 
[1] ‘1.38.0’
library("propr"); packageVersion("propr") # proportionality: compositional correlation
[1] ‘4.3.0’

Initialization

# ggplot2 package theme set
theme_set(theme_bw())

# control randomization
set.seed(42)

# save outputs
save_location = "../data/processed_carbon_53OTUs/"

Aes

# color - days
color_day = c(
    "3" = "#B2E5EA", # lightest
    "5" = "#00BAE7",
    "7" = "#0E6FA0",
    "10" = "#012652",
    "20" = "#01091C"
    )

# color - growth.phase
color_growth.phase = c(
  "early" = "black",
  "mid C:C" = "springgreen3",
  "late C:C" = "springgreen4",
  "perturbed G" = "steelblue1",
  "mid G:C" = "steelblue3",
  "late G:C" = "steelblue4",
  "perturbed M" = "sienna1",
  "mid M:C" = "sienna3",
  "late M:C" = "sienna4"
  )

# shape - series
shape_series = c(
  "C0C" = 4,
  "C" = 16,
  "G" = 15,
  "M" = 17
  )
# shape - carbon
shape_carbon = c(
  "original" = 4,
  "cellulose" = 16,
  "glucose" = 18,
  "malate" = 15
)
# shape - transfer
shape_transfer = c(
    "C0C" = 4,
    "1C" = 10,
    "2C" = 16,
    "1G" = 0,
    "2G" = 12,
    "3G" = 15,
    "1M" = 5,
    "2M" = 9,
    "3M" = 18
  )
# shape - growth phase
shape_growth.phase = c(
  "early" = 1,
  "mid C:C" = 16,
  "late C:C" = 16,
  "perturbed G" = 15,
  "mid G:C" = 15,
  "late G:C" = 15,
  "perturbed M" = 17,
  "mid M:C" = 17,
  "late M:C" = 17
  )

# color - genus

Extra Aes

# for 20 color palette
tableau_20_colors <- ggthemes::ggthemes_data[["tableau"]][["color-palettes"]][["regular"]][["Tableau 20"]]$value

Load Phyloseq Data Object

ps <- readRDS(paste(save_location, "phyloseq.rds", sep=""))
ps
phyloseq-class experiment-level object
otu_table()   OTU Table:         [ 53 taxa and 86 samples ]
sample_data() Sample Data:       [ 86 samples by 11 sample variables ]
tax_table()   Taxonomy Table:    [ 53 taxa by 7 taxonomic ranks ]
phy_tree()    Phylogenetic Tree: [ 53 tips and 52 internal nodes ]
sample_data(ps)
Sample Data:        [86 samples by 11 sample variables]:
sample_meta <- data.frame(sample_data(ps))
sample_meta
# make C0C part of C series
sample_meta$series[1] <- "C"
# make variable to store each time point (tp)
sample_meta <- sample_meta %>%
  mutate(tp = paste(series, numerical_transfer, sprintf("%02d", numerical_day), sep="-"))
# reorder data frame
sample_meta <- sample_meta[with(sample_meta, order(series, numerical_transfer, numerical_day)),]
# make tp an ordered factor
sample_meta$tp <- factor(sample_meta$tp, levels = unique(sample_meta$tp))
# make variable to store tp_order (as numeric value)
tp_order_map <- 1:length(unique(sample_meta$tp))
names(tp_order_map) <- unique(sample_meta$tp)
sample_meta <- sample_meta %>%
  mutate(tp_order = tp_order_map[as.character(tp)])
# final sample_meta
sample_meta

Alpha Diversity

ShDiv vs. RC

ggplot(sample_meta, aes(x=RC, y=shdiv, colour=growth.phase)) +
  geom_point() +
  geom_vline(xintercept = 70000, linetype = "dotted") +
  geom_vline(xintercept = 120000, linetype = "dotted") +
  scale_color_manual(values=color_growth.phase) +
  theme_set(theme_classic()) +
  ggtitle("RC vs. ShDiv")


ggplot(sample_meta, aes(x=RC, y=shdiv, alpha=0.3)) +
  geom_point(show.legend = FALSE) +
  geom_vline(xintercept = 70000, linetype = "dotted") +
  geom_vline(xintercept = 120000, linetype = "dotted") +
  theme_set(theme_classic()) +
  ggtitle("RC vs. ShDiv")


ggplot(sample_meta, aes(x=RC, y="", alpha=0.3)) +
  geom_jitter(show.legend = FALSE, width = 0) +
  theme_set(theme_classic()) +
  ggtitle("jitter (example of no correlation)")

ShDiv vs. Time Points

sample_meta$tp
 [1] C-0-10 C-1-03 C-1-03 C-1-05 C-1-05 C-1-07 C-1-07 C-1-10 C-1-10 C-1-20 C-1-20 C-2-03 C-2-03 C-2-05 C-2-05 C-2-10 C-2-10 G-1-03 G-1-03 G-1-03 G-1-05 G-1-05 G-1-05 G-1-07 G-1-07 G-1-07 G-1-10 G-1-10 G-1-10 G-2-03 G-2-03 G-2-03 G-2-05 G-2-05 G-2-05 G-2-07 G-2-07 G-2-07 G-2-10 G-2-10 G-2-10
[42] G-3-03 G-3-03 G-3-03 G-3-05 G-3-05 G-3-05 G-3-07 G-3-07 G-3-07 G-3-10 G-3-10 M-1-03 M-1-03 M-1-03 M-1-05 M-1-05 M-1-05 M-1-07 M-1-07 M-1-07 M-1-10 M-1-10 M-1-10 M-2-03 M-2-03 M-2-03 M-2-05 M-2-05 M-2-07 M-2-07 M-2-10 M-2-10 M-2-10 M-3-03 M-3-03 M-3-03 M-3-05 M-3-05 M-3-05 M-3-07 M-3-07
[83] M-3-07 M-3-10 M-3-10 M-3-10
Levels: C-0-10 C-1-03 C-1-05 C-1-07 C-1-10 C-1-20 C-2-03 C-2-05 C-2-10 G-1-03 G-1-05 G-1-07 G-1-10 G-2-03 G-2-05 G-2-07 G-2-10 G-3-03 G-3-05 G-3-07 G-3-10 M-1-03 M-1-05 M-1-07 M-1-10 M-2-03 M-2-05 M-2-07 M-2-10 M-3-03 M-3-05 M-3-07 M-3-10
sample_meta %>% 
  ggplot(aes(x=tp_order, y=shdiv)) +
    geom_smooth(method = "loess", se = FALSE, colour="red") +
    # geom_smooth(method = lm, se = FALSE, linetype = "dashed") +
    geom_vline(xintercept = 2, linetype = "dotted") +
    geom_vline(xintercept = 7, linetype = "dotted") +
    geom_vline(xintercept = 10, linetype = "dotted") +
    geom_vline(xintercept = 14, linetype = "dotted") +
    geom_vline(xintercept = 18, linetype = "dotted") +
    geom_vline(xintercept = 22, linetype = "dotted") +
    geom_vline(xintercept = 26, linetype = "dotted") +
    geom_vline(xintercept = 30, linetype = "dotted") +
    geom_point(aes(x=tp_order, y=shdiv, colour=growth.phase)) +
    scale_color_manual(values=color_growth.phase) +
    theme_set(theme_classic()) +
    theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
    scale_x_discrete(name = "time points", 
                     limits=unique(sample_meta$tp)) + 
    ggtitle("all")
`geom_smooth()` using formula 'y ~ x'

Mid-Band ShDiv vs. Time Points

sample_meta %>%
  filter(RC > 70000 & RC < 120000) %>%
  ggplot(aes(x=tp_order, y=shdiv)) +
    geom_smooth(method = "loess", se = FALSE, colour="red") +
    # geom_smooth(method = lm, se = FALSE, linetype = "dashed") +
    geom_vline(xintercept = 2, linetype = "dotted") +
    geom_vline(xintercept = 7, linetype = "dotted") +
    geom_vline(xintercept = 10, linetype = "dotted") +
    geom_vline(xintercept = 14, linetype = "dotted") +
    geom_vline(xintercept = 18, linetype = "dotted") +
    geom_vline(xintercept = 22, linetype = "dotted") +
    geom_vline(xintercept = 26, linetype = "dotted") +
    geom_vline(xintercept = 30, linetype = "dotted") +
    geom_point(aes(x=tp_order, y=shdiv, colour=growth.phase)) +
    scale_color_manual(values=color_growth.phase) +
    theme_set(theme_classic()) +
    theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
    scale_x_discrete(name = "time points", 
                     limits=unique(sample_meta$tp)) + 
    ggtitle("mid-band")
`geom_smooth()` using formula 'y ~ x'

Correlation (propr - rho)

# # only do correlation on cellulose samples --> no we want to capture corr. when perturbed and recover because overall it is same
# ps_cellulose <- readRDS(paste(save_location, "phyloseq_cellulose.rds", sep=""))
# ps_cellulose_clr <- microbiome::transform(ps_cellulose, "clr")
ps
phyloseq-class experiment-level object
otu_table()   OTU Table:         [ 53 taxa and 86 samples ]
sample_data() Sample Data:       [ 86 samples by 11 sample variables ]
tax_table()   Taxonomy Table:    [ 53 taxa by 7 taxonomic ranks ]
phy_tree()    Phylogenetic Tree: [ 53 tips and 52 internal nodes ]
(ps_clr <- microbiome::transform(ps, "clr"))
phyloseq-class experiment-level object
otu_table()   OTU Table:         [ 53 taxa and 86 samples ]
sample_data() Sample Data:       [ 86 samples by 11 sample variables ]
tax_table()   Taxonomy Table:    [ 53 taxa by 7 taxonomic ranks ]
phy_tree()    Phylogenetic Tree: [ 53 tips and 52 internal nodes ]

Calculate Proportionality, Indentify Cutoff

  • Typically FDR of 0.1 means that there is a chance that 10% of the genes are not false positive i.e. if 100 genes are called DEGs then about 10 genes are false positive.
  • 5% is usually a good cutoff
  • I want a false discovery rate of 1% (0.01)
counts <- t(as(otu_table(ps), "matrix"))
(pr <- propr(counts, # rows as samples, like it should be
            metric = "rho", # or "phi", "phs", "cor", "vlr"
            ivar = "clr", # or can use "iqlr" instead
            alpha = NA, # use to handle zeros
            p = 100)) # used by updateCutoffs
Alert: Replacing 0s with next smallest value.
Alert: Saving log-ratio transformed counts to @logratio.
Alert: Fixing permutations to active random seed.
Alert: Tabulating the presence of 0 counts.
Alert: Use '[' to index proportionality matrix.
Alert: Use 'updateCutoffs' to calculate FDR.
Not weighted and not alpha-transformed 
@counts summary: 86 subjects by 53 features
@logratio summary: 86 subjects by 53 features
@matrix summary: 53 features by 53 features
@pairs summary: index with `[` method
@fdr summary: iterations
See ?propr for object methods
# Choose the largest cutoff with an acceptable FDR.
updateCutoffs(pr,
              cutoff = seq(0, 1, .05), # cutoffs at which to estimate FDR
              ncores = 1) # parallelize here
Alert: Try parallelizing updateCutoffs with ncores > 1.
Alert: Estimating FDR for largely positive proportional pairs only.
|------------(25%)----------(50%)----------(75%)----------|
Not weighted and not alpha-transformed 
@counts summary: 86 subjects by 53 features
@logratio summary: 86 subjects by 53 features
@matrix summary: 53 features by 53 features
@pairs summary: index with `[` method
@fdr summary: iterations
See ?propr for object methods
# narrow down range to find FDR ~0.05
updateCutoffs(pr,
              cutoff = seq(0.25, 0.30, .01), # cutoffs at which to estimate FDR
              ncores = 1) # parallelize here
Alert: Try parallelizing updateCutoffs with ncores > 1.
Alert: Estimating FDR for largely positive proportional pairs only.
|------------(25%)----------(50%)----------(75%)----------|
Not weighted and not alpha-transformed 
@counts summary: 86 subjects by 53 features
@logratio summary: 86 subjects by 53 features
@matrix summary: 53 features by 53 features
@pairs summary: index with `[` method
@fdr summary: iterations
See ?propr for object methods

Get Cluster Propr

  • identify a highly proportional transcript module that happens to show differential abundance across the experimental groups
  • take an unsupervised approach by hierarchically clustering the highly proportional feature pairs based on the matrix 1−|ρp|.
  • when clustering, we call two features co-clustered if they belong to the cluster after cutting the dendrogram.
# Parameters
CUTOFF = 0.29 # rho cutoff
N <- 12 # number of clusters
# subsetting propr object to the @pairs slot
pr_best <- pr[">", CUTOFF]
pr_best@pairs
  [1]    2    3    4    5    6    7    8    9   30   41   51   56   57   58   59   60   61   62   64   65   68   69   77   89   90   92  110  111  112  113  114  121  130  164  165  166  167  174  183  189  200  218  219  220  227  236  272  354  380  382  383  386  387  395  435  436  439
 [58]  440  448  457  459  460  461  488  489  508  542  547  561  565  566  567  598  600  614  618  619  620  650  661  662  663  706  714  715  716  720  724  726  741  758  759  766  781  813  814  815  816  818  819  827  834  872  874  875  879  883  884  885  920  921  922  923  924
[115]  931  933  939  940  942  952  974  975  976  977  984  986  992  993  995 1005 1028 1029 1030 1037 1039 1045 1046 1048 1082 1083 1090 1092 1098 1099 1101 1111 1136 1145 1151 1152 1196 1198 1204 1205 1207 1217 1258 1298 1299 1352 1356 1460 1462 1473 1474 1476 1477 1480 1481 1483 1484
[172] 1515 1526 1527 1529 1530 1531 1533 1534 1536 1537 1569 1575 1577 1578 1588 1626 1632 1633 1634 1635 1636 1637 1639 1640 1642 1643 1676 1681 1682 1684 1694 1730 1731 1732 1733 1798 1799 1838 1839 1840 1892 1946 2000 2108 2118 2171 2216 2217 2218 2219 2220 2221 2222 2223 2225 2226 2270
[229] 2271 2272 2273 2274 2276 2278 2279 2324 2325 2326 2327 2331 2332 2378 2379 2380 2381 2382 2384 2385 2432 2433 2434 2435 2437 2438 2486 2490 2491 2594 2595 2649 2650 2756
# pr_best <- simplify(pr_best)

Look at the prism and bokeh functions for visualizing the co-clustering of proportional features. These plots share some key similarities: * they are all “index-naive” * they identify the feature pairs where both constituents co-cluster (with the total number of clusters toggled by k). * they return a vector of cluster memberships for all features in the propr object.

The prism function plots the variance of the ratio of the log-ratio transformed feature pair (VLR) versus the sum of the individual variances of each log-ratio transformed feature (VLS). The ratio of the VLR to the VLS equals 1−ρ. As such, we use here seven rainbow colored lines to indicate where ρ=[.01, .05, .50, 0, 1.50, 1.95, 1.99], going from red to violet. A low VLR with a high VLS suggests that the feature pair remains in an equilibrium despite high variability among the individual features.

pr_prism <- propr::prism(pr, k = N)
Warning in RColorBrewer::brewer.pal(n, pal) :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning: Removed 54 rows containing missing values (geom_point).

The bokeh function plots pairs across the individual variances of the constituent log-ratio transformed features. For clarity of visualization, this figure projects the data on a log-fold scale. Therefore, the highly variable co-clusters appear in the top-right of the figure while the lowly variable co-clusters appear in the bottom-left. Meanwhile, highly proportional pairs tend to aggregate around the y=x diagonal.

bokeh(pr, k = N)
Warning in RColorBrewer::brewer.pal(n, pal) :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning: Removed 54 rows containing missing values (geom_point).
OTU_640  OTU_23   OTU_3 OTU_107 OTU_298  OTU_87 OTU_437  OTU_27  OTU_14 OTU_429   OTU_5 OTU_136  OTU_25 OTU_215   OTU_4 OTU_548  OTU_41 OTU_467  OTU_67 OTU_608 OTU_222 OTU_315   OTU_6 OTU_259   OTU_9 OTU_521 OTU_569 OTU_116  OTU_11  OTU_43  OTU_16 OTU_284   OTU_7  OTU_20 OTU_409 OTU_565 
      1       1       2       2       2       2       2       1       1       3       3       3       4       4       5       5       6       7       7       7       7       8       7       5       4       4       4       9       9      10      10       7      11      11       6       6 
  OTU_2 OTU_115 OTU_484  OTU_15  OTU_22 OTU_457  OTU_10  OTU_51 OTU_274 OTU_211 OTU_224  OTU_36  OTU_13  OTU_30  OTU_12 OTU_584   OTU_8 
      6       8       8      10      10      12      12      12       7      12      12      12       9       9      10       7       7 

unique(pr_prism)
 [1]  1  2  3  4  5  6  7  8  9 10 11 12

Get list of higly correlated OTUs

# create new data frame of OTU cluster membership
df_c <- data.frame(pr_prism)
colnames(df_c) <- c("cluster")
df_c$cluster <- as.factor(df_c$cluster)
# create new data frame of OTU taxonomy, OTU clr
df_c_tax <- as.data.frame(as.matrix(tax_table(ps)))
df_c_clr <- as.data.frame(as(otu_table(ps_clr), "matrix"))
# merge with data frame of cluster membership
df_c <- df_c %>%
  merge(df_c_tax, by.x=0, by.y=0, all = TRUE) %>%
  column_to_rownames("Row.names") %>%
  merge(df_c_clr, by.x=0, by.y=0) %>%
  column_to_rownames("Row.names") 

# build list of valid OTUs (within-cluster pairwise rho > cutoff)
otu_c <- c()
otu_c_cluster_counts <- c()
for (x in 1:N) {
  subset_c <- rownames(filter(df_c, cluster == x))
  if ("AsIs" %in% class(subset_c)) {
    class(subset_c) <- class(subset_c)[-match("AsIs", class(subset_c))]
  }
  # get pairs with rho > cutoff AND both members in cluster n
  res_c <- getResults(pr, 
             cutoff = CUTOFF, # minimum rho value
             include = subset_c,
             or = FALSE)
  # append valid OTUs (across both Partner and Pair)
  otu_union <- union(res_c$Partner, res_c$Pair)
  otu_c_cluster_counts <- c(otu_c_cluster_counts, length(otu_union))
  otu_c <- c(otu_c, otu_union)
}

# name counts of valid OTUs per cluster
names(otu_c_cluster_counts) <- 1:N
# only keep subset of valid OTUs
df_c <- df_c[otu_c, ]
# de-index OTU column
df_c <- cbind(OTU = rownames(df_c), df_c)
rownames(df_c) <- 1:nrow(df_c)
df_c
otu_c_cluster_counts
 1  2  3  4  5  6  7  8  9 10 11 12 
 4  5  3  5  3  4  9  3  4  4  2  6 
length(unique(df_c$kingdom))
[1] 1
length(unique(df_c$phylum))
[1] 6
length(unique(df_c$class))
[1] 9
length(unique(df_c$order))
[1] 11
length(unique(df_c$family))
[1] 16
length(unique(df_c$genus))
[1] 20
length(unique(df_c$species))
[1] 22

Save to .csv

# save
write.csv(df_c, paste(save_location, "propr.csv", sep=""), quote = FALSE)

Plot, x=tp, real fit

df_c_longer <- df_c %>%
  # pivot data so each row has x=sampleID, y=clr
  pivot_longer(phyloseq::sample_names(ps_clr),
               names_to = "sampleID",
               values_to = "clr") %>%
  # add variable series
  mutate(series = sample_meta[sampleID, "series"]) %>%
  # add variable growth.phase
  mutate(growth.phase = sample_meta[sampleID, "growth.phase"]) %>%
  # add variable tp
  mutate(tp = sample_meta[sampleID, "tp"]) %>%
  # add variable tp_order
  mutate(tp_order = sample_meta[sampleID, "tp_order"])
# establish that tp is an ordered factor
df_c_longer$tp <- factor(df_c_longer$tp, levels = unique(sample_meta$tp))
# reorder data frame
df_c_longer <- df_c_longer[with(df_c_longer, order(tp)),]
df_c_longer
# line plot, faceted by cluster, colored by taxrank
df_c_longer %>%
  ggplot(aes(x=tp, y=clr, group=OTU, color=genus), alpha=0.3) +
    geom_line() +
    geom_vline(xintercept = "C-1-03", linetype = "dotted") +
    geom_vline(xintercept = "C-2-03", linetype = "dotted") +
    geom_vline(xintercept = "G-1-03", linetype = "dotted") +
    geom_vline(xintercept = "G-2-03", linetype = "dotted") +
    geom_vline(xintercept = "G-3-03", linetype = "dotted") +
    geom_vline(xintercept = "M-1-03", linetype = "dotted") +
    geom_vline(xintercept = "M-2-03", linetype = "dotted") +
    geom_vline(xintercept = "M-3-03", linetype = "dotted") +
    scale_colour_manual(values = tableau_20_colors) +
    guides(color=guide_legend(ncol=2)) +
    theme_set(theme_classic()) +
    theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
    ggtitle("all") +
    facet_wrap( ~ cluster)


# line plot, faceted by cluster, colored by taxrank
df_c_longer %>%
  filter(series == "C") %>%
  ggplot(aes(x=tp, y=clr, group=OTU, color=genus), alpha=0.3) +
    geom_line() +
    geom_vline(xintercept = "C-1-03", linetype = "dotted") +
    geom_vline(xintercept = "C-2-03", linetype = "dotted") +
    scale_colour_manual(values = tableau_20_colors) +
    guides(color=guide_legend(ncol=2)) +
    theme_set(theme_classic()) +
    theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
    ggtitle("cellulose series") +
    facet_wrap( ~ cluster)


# line plot, faceted by cluster, colored by taxrank
df_c_longer %>%
  filter(series == "G") %>%
  ggplot(aes(x=tp, y=clr, group=OTU, color=genus), alpha=0.3) +
    geom_line() +
    geom_vline(xintercept = "G-1-03", linetype = "dotted") +
    geom_vline(xintercept = "G-2-03", linetype = "dotted") +
    geom_vline(xintercept = "G-3-03", linetype = "dotted") +
    scale_colour_manual(values = tableau_20_colors) +
    guides(color=guide_legend(ncol=2)) +
    theme_set(theme_classic()) +
    theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
    ggtitle("glucose series") +
    facet_wrap( ~ cluster)


# line plot, faceted by cluster, colored by taxrank
df_c_longer %>%
  filter(series == "M") %>%
  ggplot(aes(x=tp, y=clr, group=OTU, color=genus), alpha=0.3) +
    geom_line() +
    geom_vline(xintercept = "M-1-03", linetype = "dotted") +
    geom_vline(xintercept = "M-2-03", linetype = "dotted") +
    geom_vline(xintercept = "M-3-03", linetype = "dotted") +
    scale_colour_manual(values = tableau_20_colors) +
    guides(color=guide_legend(ncol=2)) +
    theme_set(theme_classic()) +
    theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
    ggtitle("malate series") +
    facet_wrap( ~ cluster)

Plot (genus), x=tp_order, loess line of best fit

  • less jagged
  • loess lines require x_axis to be continuous
tp_order_map
C-0-10 C-1-03 C-1-05 C-1-07 C-1-10 C-1-20 C-2-03 C-2-05 C-2-10 G-1-03 G-1-05 G-1-07 G-1-10 G-2-03 G-2-05 G-2-07 G-2-10 G-3-03 G-3-05 G-3-07 G-3-10 M-1-03 M-1-05 M-1-07 M-1-10 M-2-03 M-2-05 M-2-07 M-2-10 M-3-03 M-3-05 M-3-07 M-3-10 
     1      2      3      4      5      6      7      8      9     10     11     12     13     14     15     16     17     18     19     20     21     22     23     24     25     26     27     28     29     30     31     32     33 
color_growth.phase
         early        mid C:C       late C:C    perturbed G        mid G:C       late G:C    perturbed M        mid M:C       late M:C 
       "black" "springgreen3" "springgreen4"   "steelblue1"   "steelblue3"   "steelblue4"      "sienna1"      "sienna3"      "sienna4" 
df_c_longer %>%
  ggplot(aes(x=tp_order, y=clr, group=OTU, color=genus), alpha=0.3) +
    geom_smooth(method = "loess", se = FALSE, lwd=2.0) +
    # geom_point(alpha = 0.3) +
    geom_vline(xintercept = 2, linetype = "solid", colour=color_growth.phase["mid C:C"]) +
    geom_vline(xintercept = 7, linetype = "dotted") +
    geom_vline(xintercept = 10, linetype = "solid", colour=color_growth.phase["perturbed G"]) +
    geom_vline(xintercept = 14, linetype = "dotted") +
    geom_vline(xintercept = 18, linetype = "dotted") +
    geom_vline(xintercept = 22, linetype = "solid", colour=color_growth.phase["perturbed M"]) +
    geom_vline(xintercept = 26, linetype = "dotted") +
    geom_vline(xintercept = 30, linetype = "dotted") +
    scale_colour_manual(values = tableau_20_colors) +
    guides(color=guide_legend(ncol=1)) +
    theme_set(theme_classic()) +
    theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
    scale_y_continuous(name = "log2 rAB",
                       limits = c(-7, 7),
                       breaks=c(-5, 0, 5)
                       ) +
    scale_x_discrete(name = "time points", 
                     limits=unique(df_c_longer$tp)) +
    ggtitle("all") +
    facet_wrap( ~ cluster)
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 11 rows containing non-finite values (stat_smooth).

df_c_longer %>%
  filter(series == "C") %>%
  ggplot(aes(x=tp_order, y=clr, group=OTU, color=genus), alpha=0.3) +
    geom_smooth(method = "loess", se = FALSE) +
    geom_vline(xintercept = 2, linetype = "solid", colour=color_growth.phase["mid C:C"]) +
    geom_vline(xintercept = 7, linetype = "dotted") +
    scale_colour_manual(values = tableau_20_colors) +
    guides(color=guide_legend(ncol=2)) +
    theme_set(theme_classic()) +
    theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
    scale_y_continuous(name = "log2 rAB",
                       limits = c(-7, 7),
                       breaks=c(-5, 0, 5)
                       ) +
    scale_x_discrete(name = "time points", 
                     limits=1:10,
                     labels=names(tp_order_map)[1:10]) +
    ggtitle("cellulose series") +
    facet_wrap( ~ cluster)
Warning: Continuous limits supplied to discrete scale.
Did you mean `limits = factor(...)` or `scale_*_continuous()`?
`geom_smooth()` using formula 'y ~ x'

df_c_longer %>%
  filter(series == "G") %>%
  ggplot(aes(x=tp_order, y=clr, group=OTU, color=genus), alpha=0.3) +
    geom_smooth(method = "loess", se = FALSE) +
    geom_vline(xintercept = 10, linetype = "dotted") +
    geom_vline(xintercept = 14, linetype = "solid", colour=color_growth.phase["mid C:C"]) +
    geom_vline(xintercept = 18, linetype = "dotted") +
    scale_colour_manual(values = tableau_20_colors) +
    guides(color=guide_legend(ncol=2)) +
    theme_set(theme_classic()) +
    theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
    scale_y_continuous(name = "log2 rAB",
                       limits = c(-7, 7),
                       breaks=c(-5, 0, 5)
                       ) +
    scale_x_discrete(name = "time points", 
                     limits=11:21,
                     labels=names(tp_order_map)[11:21]) +
    ggtitle("glucose series") +
    facet_wrap( ~ cluster)
Warning: Continuous limits supplied to discrete scale.
Did you mean `limits = factor(...)` or `scale_*_continuous()`?
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 2 rows containing non-finite values (stat_smooth).

df_c_longer %>%
  filter(series == "M") %>%
  ggplot(aes(x=tp_order, y=clr, group=OTU, color=genus), alpha=0.3) +
    geom_smooth(method = "loess", se = FALSE) +
    geom_vline(xintercept = 22, linetype = "dotted") +
    geom_vline(xintercept = 26, linetype = "solid", colour=color_growth.phase["mid C:C"]) +
    geom_vline(xintercept = 30, linetype = "dotted") +
    scale_colour_manual(values = tableau_20_colors) +
    guides(color=guide_legend(ncol=2)) +
    theme_set(theme_classic()) +
    theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
    scale_y_continuous(name = "log2 rAB",
                       limits = c(-7, 7),
                       breaks=c(-5, 0, 5)
                       ) +
    scale_x_discrete(name = "time points", 
                     limits=22:33,
                     labels=names(tp_order_map)[22:33]) +
    ggtitle("malate series") +
    facet_wrap( ~ cluster)
Warning: Continuous limits supplied to discrete scale.
Did you mean `limits = factor(...)` or `scale_*_continuous()`?
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 9 rows containing non-finite values (stat_smooth).

Plot (family) x=tp_order, loess line of best fit

df_c_longer %>%
  ggplot(aes(x=tp_order, y=clr, group=OTU, color=family), alpha=0.3) +
    geom_smooth(method = "loess", se = FALSE) +
    geom_vline(xintercept = 2, linetype = "dotted") +
    geom_vline(xintercept = 7, linetype = "dotted") +
    geom_vline(xintercept = 10, linetype = "dotted") +
    geom_vline(xintercept = 14, linetype = "dotted") +
    geom_vline(xintercept = 18, linetype = "dotted") +
    geom_vline(xintercept = 22, linetype = "dotted") +
    geom_vline(xintercept = 26, linetype = "dotted") +
    geom_vline(xintercept = 30, linetype = "dotted") +
    scale_colour_manual(values = tableau_20_colors) +
    guides(color=guide_legend(ncol=2)) +
    theme_set(theme_classic()) +
    theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
    scale_y_continuous(name = "log2 rAB", breaks=c(0, 5, 10)) +
    scale_x_discrete(name = "time points", 
                     limits=unique(df_c_longer$tp)) +
    ggtitle("all") +
    facet_wrap( ~ cluster)
`geom_smooth()` using formula 'y ~ x'

df_c_longer %>%
  filter(series == "C") %>%
  ggplot(aes(x=tp_order, y=clr, group=OTU, color=family), alpha=0.3) +
    geom_smooth(method = "loess", se = FALSE) +
    geom_vline(xintercept = 2, linetype = "dotted") +
    geom_vline(xintercept = 7, linetype = "dotted") +
    scale_colour_manual(values = tableau_20_colors) +
    guides(color=guide_legend(ncol=2)) +
    theme_set(theme_classic()) +
    theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
    scale_y_continuous(name = "log2 rAB", breaks=c(0, 5, 10)) +
    scale_x_discrete(name = "time points", 
                     limits=1:10,
                     labels=names(tp_order_map)[1:10]) +
    ggtitle("cellulose series") +
    facet_wrap( ~ cluster)
Warning: Continuous limits supplied to discrete scale.
Did you mean `limits = factor(...)` or `scale_*_continuous()`?
`geom_smooth()` using formula 'y ~ x'

df_c_longer %>%
  filter(series == "G") %>%
  ggplot(aes(x=tp_order, y=clr, group=OTU, color=family), alpha=0.3) +
    geom_smooth(method = "loess", se = FALSE) +
    geom_vline(xintercept = 10, linetype = "dotted") +
    geom_vline(xintercept = 14, linetype = "dotted") +
    geom_vline(xintercept = 18, linetype = "dotted") +
    scale_colour_manual(values = tableau_20_colors) +
    guides(color=guide_legend(ncol=2)) +
    theme_set(theme_classic()) +
    theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
    scale_y_continuous(name = "log2 rAB", breaks=c(0, 5, 10)) +
    scale_x_discrete(name = "time points", 
                     limits=11:21,
                     labels=names(tp_order_map)[11:21]) +
    ggtitle("glucose series") +
    facet_wrap( ~ cluster)
Warning: Continuous limits supplied to discrete scale.
Did you mean `limits = factor(...)` or `scale_*_continuous()`?
`geom_smooth()` using formula 'y ~ x'

df_c_longer %>%
  filter(series == "M") %>%
  ggplot(aes(x=tp_order, y=clr, group=OTU, color=family), alpha=0.3) +
    geom_smooth(method = "loess", se = FALSE) +
    geom_vline(xintercept = 22, linetype = "dotted") +
    geom_vline(xintercept = 26, linetype = "dotted") +
    geom_vline(xintercept = 30, linetype = "dotted") +
    scale_colour_manual(values = tableau_20_colors) +
    guides(color=guide_legend(ncol=2)) +
    theme_set(theme_classic()) +
    theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
    scale_y_continuous(name = "log2 rAB", breaks=c(0, 5, 10)) +
    scale_x_discrete(name = "time points", 
                     limits=22:33,
                     labels=names(tp_order_map)[22:33]) +
    ggtitle("malate series") +
    facet_wrap( ~ cluster)
Warning: Continuous limits supplied to discrete scale.
Did you mean `limits = factor(...)` or `scale_*_continuous()`?
`geom_smooth()` using formula 'y ~ x'

Plot corr per transfer

  • Plot each prev day + transfer separately
  • Facet by cluster

Plots: A: C0C - C1 B: C1-20 - C1

C: C0C - G1 D: G1-10 - G2 E: G2-10 - G3

F: C0C - M1 G: M1-10 - M2 H: M2-10 - M3

unique(sample_meta$tp)
 [1] C-0-10 C-1-03 C-1-05 C-1-07 C-1-10 C-1-20 C-2-03 C-2-05 C-2-10 G-1-03 G-1-05 G-1-07 G-1-10 G-2-03 G-2-05 G-2-07 G-2-10 G-3-03 G-3-05 G-3-07 G-3-10 M-1-03 M-1-05 M-1-07 M-1-10 M-2-03 M-2-05 M-2-07 M-2-10 M-3-03 M-3-05 M-3-07 M-3-10
Levels: C-0-10 C-1-03 C-1-05 C-1-07 C-1-10 C-1-20 C-2-03 C-2-05 C-2-10 G-1-03 G-1-05 G-1-07 G-1-10 G-2-03 G-2-05 G-2-07 G-2-10 G-3-03 G-3-05 G-3-07 G-3-10 M-1-03 M-1-05 M-1-07 M-1-10 M-2-03 M-2-05 M-2-07 M-2-10 M-3-03 M-3-05 M-3-07 M-3-10
sample_meta$transfer
 [1] C0C 1C  1C  1C  1C  1C  1C  1C  1C  1C  1C  2C  2C  2C  2C  2C  2C  1G  1G  1G  1G  1G  1G  1G  1G  1G  1G  1G  1G  2G  2G  2G  2G  2G  2G  2G  2G  2G  2G  2G  2G  3G  3G  3G  3G  3G  3G  3G  3G  3G  3G  3G  1M  1M  1M  1M  1M  1M  1M  1M  1M  1M  1M  1M  2M  2M  2M  2M  2M  2M  2M  2M 
[73] 2M  2M  3M  3M  3M  3M  3M  3M  3M  3M  3M  3M  3M  3M 
Levels: C0C 1C 2C 1G 2G 3G 1M 2M 3M
# new data frame
df_d_longer <- df_c %>%
  # pivot data so each row has x=sampleID, y=clr
  pivot_longer(phyloseq::sample_names(ps_clr),
               names_to = "sampleID",
               values_to = "clr") %>%
  # add variable transfer
  mutate(transfer = sample_meta[sampleID, "transfer"]) %>%
  # add variable tp
  mutate(tp = sample_meta[sampleID, "tp"])
# establish that tp is an ordered factor
df_d_longer$tp <- factor(df_d_longer$tp, levels = unique(sample_meta$tp))
# reorder data frame
df_d_longer <- df_d_longer[with(df_d_longer, order(tp)),]
df_d_longer
plot_corr_per_transfer <- function(df_d_longer, tp_order_map, title, legend_pos="right") {
  df_d_longer %>%
  # filter data
  filter(tp %in% names(tp_order_map)) %>%
  # numerical ordered x-axis
  mutate(tp_order = tp_order_map[as.character(tp)]) %>%
  # plot
  ggplot(aes(x=tp_order, y=clr, group=OTU, color=genus), alpha=0.3) +
    geom_point() +
    geom_smooth(method = "loess", se = FALSE) +
    geom_vline(xintercept = 2, linetype = "dotted", alpha=0.3) +
    geom_hline(yintercept = 5, linetype = "dotted", alpha=0.3) +
    geom_hline(yintercept = 0, linetype = "dashed", alpha=0.3) +
    geom_hline(yintercept = -5, linetype = "dotted", alpha=0.3) +
    theme_set(theme_classic()) +
    scale_colour_manual(values = tableau_20_colors) +
    theme(axis.text.x = element_text(angle = 60, hjust = 1),
          legend.position = legend_pos) +
    guides(color=guide_legend(ncol=2)) +
    scale_y_continuous(name = "log2 rAB",
                       limits = c(-7, 7),
                       breaks=c(-5, 0, 5)) +
    # x-axis labeling
    scale_x_discrete(name = "time points",
                     limits=1:length(tp_order_map),
                     labels=names(tp_order_map)) +
    facet_wrap( ~ cluster) +
    ggtitle(title)
}
unique(df_d_longer$tp)
 [1] C-0-10 C-1-03 C-1-05 C-1-07 C-1-10 C-1-20 C-2-03 C-2-05 C-2-10 G-1-03 G-1-05 G-1-07 G-1-10 G-2-03 G-2-05 G-2-07 G-2-10 G-3-03 G-3-05 G-3-07 G-3-10 M-1-03 M-1-05 M-1-07 M-1-10 M-2-03 M-2-05 M-2-07 M-2-10 M-3-03 M-3-05 M-3-07 M-3-10
Levels: C-0-10 C-1-03 C-1-05 C-1-07 C-1-10 C-1-20 C-2-03 C-2-05 C-2-10 G-1-03 G-1-05 G-1-07 G-1-10 G-2-03 G-2-05 G-2-07 G-2-10 G-3-03 G-3-05 G-3-07 G-3-10 M-1-03 M-1-05 M-1-07 M-1-10 M-2-03 M-2-05 M-2-07 M-2-10 M-3-03 M-3-05 M-3-07 M-3-10
# 1C
plot_corr_per_transfer(df_d_longer,
                       tp_order_map = c(
                         "C-0-10" = 1,
                         "C-1-03" = 2,
                         "C-1-05" = 3,
                         "C-1-07" = 4,
                         "C-1-10" = 5,
                         "C-1-20" = 6),
                       title = "first transfer onto cellulose (1C)")
Warning: Continuous limits supplied to discrete scale.
Did you mean `limits = factor(...)` or `scale_*_continuous()`?
`geom_smooth()` using formula 'y ~ x'

# 2C
plot_corr_per_transfer(df_d_longer,
                       tp_order_map = c(
                         "C-1-20" = 1,
                         "C-2-03" = 2,
                         "C-2-05" = 3,
                         "C-2-10" = 4),
                       title = "second transfer onto cellulose (2C)")
Warning: Continuous limits supplied to discrete scale.
Did you mean `limits = factor(...)` or `scale_*_continuous()`?
`geom_smooth()` using formula 'y ~ x'
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.985
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.015
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  6.924e-17
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 4.0602

# 1G
plot_corr_per_transfer(df_d_longer,
                       tp_order_map = c(
                         "C-0-10" = 1,
                         "G-1-03" = 2,
                         "G-1-05" = 3,
                         "G-1-07" = 4,
                         "G-1-10" = 5),
                       title = "perturbation transfer onto glucose (1G)")
Warning: Continuous limits supplied to discrete scale.
Did you mean `limits = factor(...)` or `scale_*_continuous()`?
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 2 rows containing non-finite values (stat_smooth).
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning: Removed 2 rows containing missing values (geom_point).
Warning: Removed 2 rows containing missing values (geom_smooth).

# 2G
plot_corr_per_transfer(df_d_longer,
                       tp_order_map = c(
                         "G-1-10" = 1,
                         "G-2-03" = 2,
                         "G-2-05" = 3,
                         "G-2-07" = 4,
                         "G-2-10" = 5),
                       title = "first transfer back onto cellulose (2G)")
Warning: Continuous limits supplied to discrete scale.
Did you mean `limits = factor(...)` or `scale_*_continuous()`?
`geom_smooth()` using formula 'y ~ x'

# 3G
plot_corr_per_transfer(df_d_longer,
                       tp_order_map = c(
                         "G-2-10" = 1,
                         "G-3-03" = 2,
                         "G-3-05" = 3,
                         "G-3-07" = 4,
                         "G-3-10" = 5),
                       title = "second transfer back onto cellulose (3G)")
Warning: Continuous limits supplied to discrete scale.
Did you mean `limits = factor(...)` or `scale_*_continuous()`?
`geom_smooth()` using formula 'y ~ x'

# 1M
plot_corr_per_transfer(df_d_longer,
                       tp_order_map = c(
                         "C-0-10" = 1,
                         "M-1-03" = 2,
                         "M-1-05" = 3,
                         "M-1-07" = 4,
                         "M-1-10" = 5),
                       title = "perturbation transfer onto malate (1M)")
Warning: Continuous limits supplied to discrete scale.
Did you mean `limits = factor(...)` or `scale_*_continuous()`?
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 9 rows containing non-finite values (stat_smooth).
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  span too small.   fewer data values than degrees of freedom.
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 0.98
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 4.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  at  5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  radius  0.0004
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  all data on boundary of neighborhood. make span bigger
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 0.0004
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  zero-width neighborhood. make span bigger
Warning: Computation failed in `stat_smooth()`:
NA/NaN/Inf in foreign function call (arg 5)
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  pseudoinverse used at 5.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  neighborhood radius 2.02
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  reciprocal condition number  0
Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
  There are other near singularities as well. 1
Warning: Removed 9 rows containing missing values (geom_point).

# 2M
plot_corr_per_transfer(df_d_longer,
                       tp_order_map = c(
                         "M-1-10" = 1,
                         "M-2-03" = 2,
                         "M-2-05" = 3,
                         "M-2-07" = 4,
                         "M-2-10" = 5),
                       title = "first transfer back onto cellulose (2M)")
Warning: Continuous limits supplied to discrete scale.
Did you mean `limits = factor(...)` or `scale_*_continuous()`?
`geom_smooth()` using formula 'y ~ x'

# 3M
plot_corr_per_transfer(df_d_longer,
                       tp_order_map = c(
                         "M-2-10" = 1,
                         "M-3-03" = 2,
                         "M-3-05" = 3,
                         "M-3-07" = 4,
                         "M-3-10" = 5),
                       title = "second transfer back onto cellulose (3M)")
Warning: Continuous limits supplied to discrete scale.
Did you mean `limits = factor(...)` or `scale_*_continuous()`?
`geom_smooth()` using formula 'y ~ x'

LS0tCnRpdGxlOiAiYWxwaGFfZGl2ZXJzaXR5X2FuZF9jb3JyZWxhdGlvbiIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKR29hbDogdHJhY2sgQWxwaGEgRGl2ZXJzaXR5IGFuZCBQcm9wb3J0aW9uYWxpdHkgb3ZlciBzYW1wbGVzIGFuZCBlc3RhYmxpc2ggc2FtcGxlIG9yZGVyaW5nCgojIEluc3RhbGxhdGlvbgoKYGBge3J9CiMgZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJ0cHEvcHJvcHIiKQojIGluc3RhbGwucGFja2FnZXMoJ2dnZGVuZHJvJykKYGBgCgpgYGB7cn0KIyBkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoImpybm9sZC9nZ3RoZW1lcyIpCiMgaW5zdGFsbC5wYWNrYWdlcygiZ2d0aGVtZXMiKSAjIGhhcyB0YWJsZWF1X3RhYmxlYXUyMCBjb2xvciBwYWxldHRlCmBgYAoKCiMgTG9hZGluZyBSZXF1aXJlZCBQYWNrYWdlcwoKYGBge3J9CmxpYnJhcnkoImdncGxvdDIiKTsgcGFja2FnZVZlcnNpb24oImdncGxvdDIiKSAjIHBsb3R0aW5nCmBgYApgYGB7cn0KbGlicmFyeSgidGlkeXZlcnNlIik7IHBhY2thZ2VWZXJzaW9uKCJ0aWR5dmVyc2UiKSAjIHV0aWwgICAgICAgICAgICAgIApgYGAKYGBge3J9CmxpYnJhcnkoImRwbHlyIik7IHBhY2thZ2VWZXJzaW9uKCJkcGx5ciIpICMgdXRpbApgYGAKYGBge3J9CmxpYnJhcnkoInBoeWxvc2VxIik7IHBhY2thZ2VWZXJzaW9uKCJwaHlsb3NlcSIpICMgZGF0YSBvYmplY3QgICAgICAgICAgICAgICAgIApgYGAKYGBge3J9CmxpYnJhcnkoInByb3ByIik7IHBhY2thZ2VWZXJzaW9uKCJwcm9wciIpICMgcHJvcG9ydGlvbmFsaXR5OiBjb21wb3NpdGlvbmFsIGNvcnJlbGF0aW9uCmBgYAojIEluaXRpYWxpemF0aW9uCgpgYGB7cn0KIyBnZ3Bsb3QyIHBhY2thZ2UgdGhlbWUgc2V0CnRoZW1lX3NldCh0aGVtZV9idygpKQoKIyBjb250cm9sIHJhbmRvbWl6YXRpb24Kc2V0LnNlZWQoNDIpCgojIHNhdmUgb3V0cHV0cwpzYXZlX2xvY2F0aW9uID0gIi4uL2RhdGEvcHJvY2Vzc2VkX2NhcmJvbl81M09UVXMvIgpgYGAKCiMgQWVzCmBgYHtyfQojIGNvbG9yIC0gZGF5cwpjb2xvcl9kYXkgPSBjKAogICAgIjMiID0gIiNCMkU1RUEiLCAjIGxpZ2h0ZXN0CiAgICAiNSIgPSAiIzAwQkFFNyIsCiAgICAiNyIgPSAiIzBFNkZBMCIsCiAgICAiMTAiID0gIiMwMTI2NTIiLAogICAgIjIwIiA9ICIjMDEwOTFDIgogICAgKQoKIyBjb2xvciAtIGdyb3d0aC5waGFzZQpjb2xvcl9ncm93dGgucGhhc2UgPSBjKAogICJlYXJseSIgPSAiYmxhY2siLAogICJtaWQgQzpDIiA9ICJzcHJpbmdncmVlbjMiLAogICJsYXRlIEM6QyIgPSAic3ByaW5nZ3JlZW40IiwKICAicGVydHVyYmVkIEciID0gInN0ZWVsYmx1ZTEiLAogICJtaWQgRzpDIiA9ICJzdGVlbGJsdWUzIiwKICAibGF0ZSBHOkMiID0gInN0ZWVsYmx1ZTQiLAogICJwZXJ0dXJiZWQgTSIgPSAic2llbm5hMSIsCiAgIm1pZCBNOkMiID0gInNpZW5uYTMiLAogICJsYXRlIE06QyIgPSAic2llbm5hNCIKICApCgojIHNoYXBlIC0gc2VyaWVzCnNoYXBlX3NlcmllcyA9IGMoCiAgIkMwQyIgPSA0LAogICJDIiA9IDE2LAogICJHIiA9IDE1LAogICJNIiA9IDE3CiAgKQojIHNoYXBlIC0gY2FyYm9uCnNoYXBlX2NhcmJvbiA9IGMoCiAgIm9yaWdpbmFsIiA9IDQsCiAgImNlbGx1bG9zZSIgPSAxNiwKICAiZ2x1Y29zZSIgPSAxOCwKICAibWFsYXRlIiA9IDE1CikKIyBzaGFwZSAtIHRyYW5zZmVyCnNoYXBlX3RyYW5zZmVyID0gYygKICAgICJDMEMiID0gNCwKICAgICIxQyIgPSAxMCwKICAgICIyQyIgPSAxNiwKICAgICIxRyIgPSAwLAogICAgIjJHIiA9IDEyLAogICAgIjNHIiA9IDE1LAogICAgIjFNIiA9IDUsCiAgICAiMk0iID0gOSwKICAgICIzTSIgPSAxOAogICkKIyBzaGFwZSAtIGdyb3d0aCBwaGFzZQpzaGFwZV9ncm93dGgucGhhc2UgPSBjKAogICJlYXJseSIgPSAxLAogICJtaWQgQzpDIiA9IDE2LAogICJsYXRlIEM6QyIgPSAxNiwKICAicGVydHVyYmVkIEciID0gMTUsCiAgIm1pZCBHOkMiID0gMTUsCiAgImxhdGUgRzpDIiA9IDE1LAogICJwZXJ0dXJiZWQgTSIgPSAxNywKICAibWlkIE06QyIgPSAxNywKICAibGF0ZSBNOkMiID0gMTcKICApCgojIGNvbG9yIC0gZ2VudXMKYGBgCgojIyBFeHRyYSBBZXMKCmBgYHtyfQojIGZvciAyMCBjb2xvciBwYWxldHRlCnRhYmxlYXVfMjBfY29sb3JzIDwtIGdndGhlbWVzOjpnZ3RoZW1lc19kYXRhW1sidGFibGVhdSJdXVtbImNvbG9yLXBhbGV0dGVzIl1dW1sicmVndWxhciJdXVtbIlRhYmxlYXUgMjAiXV0kdmFsdWUKYGBgCgojIExvYWQgUGh5bG9zZXEgRGF0YSBPYmplY3QKCmBgYHtyfQpwcyA8LSByZWFkUkRTKHBhc3RlKHNhdmVfbG9jYXRpb24sICJwaHlsb3NlcS5yZHMiLCBzZXA9IiIpKQpwcwpgYGAKCmBgYHtyfQpzYW1wbGVfZGF0YShwcykKYGBgCgpgYGB7cn0Kc2FtcGxlX21ldGEgPC0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShwcykpCnNhbXBsZV9tZXRhCmBgYAoKYGBge3J9CiMgbWFrZSBDMEMgcGFydCBvZiBDIHNlcmllcwpzYW1wbGVfbWV0YSRzZXJpZXNbMV0gPC0gIkMiCiMgbWFrZSB2YXJpYWJsZSB0byBzdG9yZSBlYWNoIHRpbWUgcG9pbnQgKHRwKQpzYW1wbGVfbWV0YSA8LSBzYW1wbGVfbWV0YSAlPiUKICBtdXRhdGUodHAgPSBwYXN0ZShzZXJpZXMsIG51bWVyaWNhbF90cmFuc2Zlciwgc3ByaW50ZigiJTAyZCIsIG51bWVyaWNhbF9kYXkpLCBzZXA9Ii0iKSkKIyByZW9yZGVyIGRhdGEgZnJhbWUKc2FtcGxlX21ldGEgPC0gc2FtcGxlX21ldGFbd2l0aChzYW1wbGVfbWV0YSwgb3JkZXIoc2VyaWVzLCBudW1lcmljYWxfdHJhbnNmZXIsIG51bWVyaWNhbF9kYXkpKSxdCiMgbWFrZSB0cCBhbiBvcmRlcmVkIGZhY3RvcgpzYW1wbGVfbWV0YSR0cCA8LSBmYWN0b3Ioc2FtcGxlX21ldGEkdHAsIGxldmVscyA9IHVuaXF1ZShzYW1wbGVfbWV0YSR0cCkpCiMgbWFrZSB2YXJpYWJsZSB0byBzdG9yZSB0cF9vcmRlciAoYXMgbnVtZXJpYyB2YWx1ZSkKdHBfb3JkZXJfbWFwIDwtIDE6bGVuZ3RoKHVuaXF1ZShzYW1wbGVfbWV0YSR0cCkpCm5hbWVzKHRwX29yZGVyX21hcCkgPC0gdW5pcXVlKHNhbXBsZV9tZXRhJHRwKQpzYW1wbGVfbWV0YSA8LSBzYW1wbGVfbWV0YSAlPiUKICBtdXRhdGUodHBfb3JkZXIgPSB0cF9vcmRlcl9tYXBbYXMuY2hhcmFjdGVyKHRwKV0pCiMgZmluYWwgc2FtcGxlX21ldGEKc2FtcGxlX21ldGEKYGBgCiMgQWxwaGEgRGl2ZXJzaXR5CgojIyBTaERpdiB2cy4gUkMKCmBgYHtyfQpnZ3Bsb3Qoc2FtcGxlX21ldGEsIGFlcyh4PVJDLCB5PXNoZGl2LCBjb2xvdXI9Z3Jvd3RoLnBoYXNlKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNzAwMDAsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxMjAwMDAsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWNvbG9yX2dyb3d0aC5waGFzZSkgKwogIHRoZW1lX3NldCh0aGVtZV9jbGFzc2ljKCkpICsKICBnZ3RpdGxlKCJSQyB2cy4gU2hEaXYiKQoKZ2dwbG90KHNhbXBsZV9tZXRhLCBhZXMoeD1SQywgeT1zaGRpdiwgYWxwaGE9MC4zKSkgKwogIGdlb21fcG9pbnQoc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDcwMDAwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTIwMDAwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgdGhlbWVfc2V0KHRoZW1lX2NsYXNzaWMoKSkgKwogIGdndGl0bGUoIlJDIHZzLiBTaERpdiIpCgpnZ3Bsb3Qoc2FtcGxlX21ldGEsIGFlcyh4PVJDLCB5PSIiLCBhbHBoYT0wLjMpKSArCiAgZ2VvbV9qaXR0ZXIoc2hvdy5sZWdlbmQgPSBGQUxTRSwgd2lkdGggPSAwKSArCiAgdGhlbWVfc2V0KHRoZW1lX2NsYXNzaWMoKSkgKwogIGdndGl0bGUoImppdHRlciAoZXhhbXBsZSBvZiBubyBjb3JyZWxhdGlvbikiKQpgYGAKCiMjIFNoRGl2IHZzLiBUaW1lIFBvaW50cwoKYGBge3J9CnNhbXBsZV9tZXRhJHRwCmBgYAoKYGBge3J9CnNhbXBsZV9tZXRhICU+JSAKICBnZ3Bsb3QoYWVzKHg9dHBfb3JkZXIsIHk9c2hkaXYpKSArCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFLCBjb2xvdXI9InJlZCIpICsKICAgICMgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0sIHNlID0gRkFMU0UsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDcsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxNCwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTgsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIyLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyNiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMzAsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIGdlb21fcG9pbnQoYWVzKHg9dHBfb3JkZXIsIHk9c2hkaXYsIGNvbG91cj1ncm93dGgucGhhc2UpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWNvbG9yX2dyb3d0aC5waGFzZSkgKwogICAgdGhlbWVfc2V0KHRoZW1lX2NsYXNzaWMoKSkgKwogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxKSkgKwogICAgc2NhbGVfeF9kaXNjcmV0ZShuYW1lID0gInRpbWUgcG9pbnRzIiwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz11bmlxdWUoc2FtcGxlX21ldGEkdHApKSArIAogICAgZ2d0aXRsZSgiYWxsIikKYGBgCgojIyBNaWQtQmFuZCBTaERpdiB2cy4gVGltZSBQb2ludHMKCmBgYHtyfQpzYW1wbGVfbWV0YSAlPiUKICBmaWx0ZXIoUkMgPiA3MDAwMCAmIFJDIDwgMTIwMDAwKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dHBfb3JkZXIsIHk9c2hkaXYpKSArCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFLCBjb2xvdXI9InJlZCIpICsKICAgICMgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0sIHNlID0gRkFMU0UsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDcsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxNCwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTgsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIyLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyNiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMzAsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIGdlb21fcG9pbnQoYWVzKHg9dHBfb3JkZXIsIHk9c2hkaXYsIGNvbG91cj1ncm93dGgucGhhc2UpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWNvbG9yX2dyb3d0aC5waGFzZSkgKwogICAgdGhlbWVfc2V0KHRoZW1lX2NsYXNzaWMoKSkgKwogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxKSkgKwogICAgc2NhbGVfeF9kaXNjcmV0ZShuYW1lID0gInRpbWUgcG9pbnRzIiwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz11bmlxdWUoc2FtcGxlX21ldGEkdHApKSArIAogICAgZ2d0aXRsZSgibWlkLWJhbmQiKQpgYGAKCiMgQ29ycmVsYXRpb24gKHByb3ByIC0gcmhvKQoKYGBge3J9CiMgIyBvbmx5IGRvIGNvcnJlbGF0aW9uIG9uIGNlbGx1bG9zZSBzYW1wbGVzIC0tPiBubyB3ZSB3YW50IHRvIGNhcHR1cmUgY29yci4gd2hlbiBwZXJ0dXJiZWQgYW5kIHJlY292ZXIgYmVjYXVzZSBvdmVyYWxsIGl0IGlzIHNhbWUKIyBwc19jZWxsdWxvc2UgPC0gcmVhZFJEUyhwYXN0ZShzYXZlX2xvY2F0aW9uLCAicGh5bG9zZXFfY2VsbHVsb3NlLnJkcyIsIHNlcD0iIikpCiMgcHNfY2VsbHVsb3NlX2NsciA8LSBtaWNyb2Jpb21lOjp0cmFuc2Zvcm0ocHNfY2VsbHVsb3NlLCAiY2xyIikKYGBgCgpgYGB7cn0KcHMKKHBzX2NsciA8LSBtaWNyb2Jpb21lOjp0cmFuc2Zvcm0ocHMsICJjbHIiKSkKYGBgCgojIyBDYWxjdWxhdGUgUHJvcG9ydGlvbmFsaXR5LCBJbmRlbnRpZnkgQ3V0b2ZmCgoqIFR5cGljYWxseSBGRFIgb2YgMC4xIG1lYW5zIHRoYXQgdGhlcmUgaXMgYSBjaGFuY2UgdGhhdCAxMCUgb2YgdGhlIGdlbmVzIGFyZSBub3QgZmFsc2UgcG9zaXRpdmUgaS5lLiBpZiAxMDAgZ2VuZXMgYXJlIGNhbGxlZCBERUdzIHRoZW4gYWJvdXQgMTAgZ2VuZXMgYXJlIGZhbHNlIHBvc2l0aXZlLgoqIDUlIGlzIHVzdWFsbHkgYSBnb29kIGN1dG9mZgoqIEkgd2FudCBhIGZhbHNlIGRpc2NvdmVyeSByYXRlIG9mIDElICgwLjAxKQoKCmBgYHtyfQpjb3VudHMgPC0gdChhcyhvdHVfdGFibGUocHMpLCAibWF0cml4IikpCihwciA8LSBwcm9wcihjb3VudHMsICMgcm93cyBhcyBzYW1wbGVzLCBsaWtlIGl0IHNob3VsZCBiZQogICAgICAgICAgICBtZXRyaWMgPSAicmhvIiwgIyBvciAicGhpIiwgInBocyIsICJjb3IiLCAidmxyIgogICAgICAgICAgICBpdmFyID0gImNsciIsICMgb3IgY2FuIHVzZSAiaXFsciIgaW5zdGVhZAogICAgICAgICAgICBhbHBoYSA9IE5BLCAjIHVzZSB0byBoYW5kbGUgemVyb3MKICAgICAgICAgICAgcCA9IDEwMCkpICMgdXNlZCBieSB1cGRhdGVDdXRvZmZzCiMgQ2hvb3NlIHRoZSBsYXJnZXN0IGN1dG9mZiB3aXRoIGFuIGFjY2VwdGFibGUgRkRSLgp1cGRhdGVDdXRvZmZzKHByLAogICAgICAgICAgICAgIGN1dG9mZiA9IHNlcSgwLCAxLCAuMDUpLCAjIGN1dG9mZnMgYXQgd2hpY2ggdG8gZXN0aW1hdGUgRkRSCiAgICAgICAgICAgICAgbmNvcmVzID0gMSkgIyBwYXJhbGxlbGl6ZSBoZXJlCiMgbmFycm93IGRvd24gcmFuZ2UgdG8gZmluZCBGRFIgfjAuMDUKdXBkYXRlQ3V0b2ZmcyhwciwKICAgICAgICAgICAgICBjdXRvZmYgPSBzZXEoMC4yNSwgMC4zMCwgLjAxKSwgIyBjdXRvZmZzIGF0IHdoaWNoIHRvIGVzdGltYXRlIEZEUgogICAgICAgICAgICAgIG5jb3JlcyA9IDEpICMgcGFyYWxsZWxpemUgaGVyZQpgYGAKIyMgR2V0IENsdXN0ZXIgUHJvcHIKKiBpZGVudGlmeSBhIGhpZ2hseSBwcm9wb3J0aW9uYWwgdHJhbnNjcmlwdCBtb2R1bGUgdGhhdCBoYXBwZW5zIHRvIHNob3cgZGlmZmVyZW50aWFsIGFidW5kYW5jZSBhY3Jvc3MgdGhlIGV4cGVyaW1lbnRhbCBncm91cHMKKiB0YWtlIGFuIHVuc3VwZXJ2aXNlZCBhcHByb2FjaCBieSBoaWVyYXJjaGljYWxseSBjbHVzdGVyaW5nIHRoZSBoaWdobHkgcHJvcG9ydGlvbmFsIGZlYXR1cmUgcGFpcnMgYmFzZWQgb24gdGhlIG1hdHJpeCAx4oiSfM+BcHwuCiogd2hlbiBjbHVzdGVyaW5nLCB3ZSBjYWxsIHR3byBmZWF0dXJlcyBjby1jbHVzdGVyZWQgaWYgdGhleSBiZWxvbmcgdG8gdGhlIGNsdXN0ZXIgYWZ0ZXIgY3V0dGluZyB0aGUgZGVuZHJvZ3JhbS4gCgpgYGB7cn0KIyBQYXJhbWV0ZXJzCkNVVE9GRiA9IDAuMjkgIyByaG8gY3V0b2ZmCk4gPC0gMTIgIyBudW1iZXIgb2YgY2x1c3RlcnMKYGBgCgpgYGB7cn0KIyBzdWJzZXR0aW5nIHByb3ByIG9iamVjdCB0byB0aGUgQHBhaXJzIHNsb3QKcHJfYmVzdCA8LSBwclsiPiIsIENVVE9GRl0KcHJfYmVzdEBwYWlycwojIHByX2Jlc3QgPC0gc2ltcGxpZnkocHJfYmVzdCkKYGBgCkxvb2sgYXQgdGhlIHByaXNtIGFuZCBib2tlaCBmdW5jdGlvbnMgZm9yIHZpc3VhbGl6aW5nIHRoZSBjby1jbHVzdGVyaW5nIG9mIHByb3BvcnRpb25hbCBmZWF0dXJlcy4gVGhlc2UgcGxvdHMgc2hhcmUgc29tZSBrZXkgc2ltaWxhcml0aWVzOgoqIHRoZXkgYXJlIGFsbCDigJxpbmRleC1uYWl2ZeKAnQoqIHRoZXkgaWRlbnRpZnkgdGhlIGZlYXR1cmUgcGFpcnMgd2hlcmUgYm90aCBjb25zdGl0dWVudHMgY28tY2x1c3RlciAod2l0aCB0aGUgdG90YWwgbnVtYmVyIG9mIGNsdXN0ZXJzIHRvZ2dsZWQgYnkgaykuCiogdGhleSByZXR1cm4gYSB2ZWN0b3Igb2YgY2x1c3RlciBtZW1iZXJzaGlwcyBmb3IgYWxsIGZlYXR1cmVzIGluIHRoZSBwcm9wciBvYmplY3QuCgpUaGUgcHJpc20gZnVuY3Rpb24gcGxvdHMgdGhlIHZhcmlhbmNlIG9mIHRoZSByYXRpbyBvZiB0aGUgbG9nLXJhdGlvIHRyYW5zZm9ybWVkIGZlYXR1cmUgcGFpciAoVkxSKSB2ZXJzdXMgdGhlIHN1bSBvZiB0aGUgaW5kaXZpZHVhbCB2YXJpYW5jZXMgb2YgZWFjaCBsb2ctcmF0aW8gdHJhbnNmb3JtZWQgZmVhdHVyZSAoVkxTKS4gVGhlIHJhdGlvIG9mIHRoZSBWTFIgdG8gdGhlIFZMUyBlcXVhbHMgMeKIks+BLiBBcyBzdWNoLCB3ZSB1c2UgaGVyZSBzZXZlbiByYWluYm93IGNvbG9yZWQgbGluZXMgdG8gaW5kaWNhdGUgd2hlcmUgz4E9Wy4wMSwgLjA1LCAuNTAsIDAsIDEuNTAsIDEuOTUsIDEuOTldLCBnb2luZyBmcm9tIHJlZCB0byB2aW9sZXQuIEEgbG93IFZMUiB3aXRoIGEgaGlnaCBWTFMgc3VnZ2VzdHMgdGhhdCB0aGUgZmVhdHVyZSBwYWlyIHJlbWFpbnMgaW4gYW4gZXF1aWxpYnJpdW0gZGVzcGl0ZSBoaWdoIHZhcmlhYmlsaXR5IGFtb25nIHRoZSBpbmRpdmlkdWFsIGZlYXR1cmVzLgoKYGBge3J9CnByX3ByaXNtIDwtIHByb3ByOjpwcmlzbShwciwgayA9IE4pCmBgYAoKVGhlIGJva2VoIGZ1bmN0aW9uIHBsb3RzIHBhaXJzIGFjcm9zcyB0aGUgaW5kaXZpZHVhbCB2YXJpYW5jZXMgb2YgdGhlIGNvbnN0aXR1ZW50IGxvZy1yYXRpbyB0cmFuc2Zvcm1lZCBmZWF0dXJlcy4gRm9yIGNsYXJpdHkgb2YgdmlzdWFsaXphdGlvbiwgdGhpcyBmaWd1cmUgcHJvamVjdHMgdGhlIGRhdGEgb24gYSBsb2ctZm9sZCBzY2FsZS4gVGhlcmVmb3JlLCB0aGUgaGlnaGx5IHZhcmlhYmxlIGNvLWNsdXN0ZXJzIGFwcGVhciBpbiB0aGUgdG9wLXJpZ2h0IG9mIHRoZSBmaWd1cmUgd2hpbGUgdGhlIGxvd2x5IHZhcmlhYmxlIGNvLWNsdXN0ZXJzIGFwcGVhciBpbiB0aGUgYm90dG9tLWxlZnQuIE1lYW53aGlsZSwgaGlnaGx5IHByb3BvcnRpb25hbCBwYWlycyB0ZW5kIHRvIGFnZ3JlZ2F0ZSBhcm91bmQgdGhlIHk9eCBkaWFnb25hbC4KCmBgYHtyfQpib2tlaChwciwgayA9IE4pCmBgYAoKCgoKYGBge3J9CnVuaXF1ZShwcl9wcmlzbSkKYGBgCgojIEdldCBsaXN0IG9mIGhpZ2x5IGNvcnJlbGF0ZWQgT1RVcwoKYGBge3J9CiMgY3JlYXRlIG5ldyBkYXRhIGZyYW1lIG9mIE9UVSBjbHVzdGVyIG1lbWJlcnNoaXAKZGZfYyA8LSBkYXRhLmZyYW1lKHByX3ByaXNtKQpjb2xuYW1lcyhkZl9jKSA8LSBjKCJjbHVzdGVyIikKZGZfYyRjbHVzdGVyIDwtIGFzLmZhY3RvcihkZl9jJGNsdXN0ZXIpCiMgY3JlYXRlIG5ldyBkYXRhIGZyYW1lIG9mIE9UVSB0YXhvbm9teSwgT1RVIGNscgpkZl9jX3RheCA8LSBhcy5kYXRhLmZyYW1lKGFzLm1hdHJpeCh0YXhfdGFibGUocHMpKSkKZGZfY19jbHIgPC0gYXMuZGF0YS5mcmFtZShhcyhvdHVfdGFibGUocHNfY2xyKSwgIm1hdHJpeCIpKQojIG1lcmdlIHdpdGggZGF0YSBmcmFtZSBvZiBjbHVzdGVyIG1lbWJlcnNoaXAKZGZfYyA8LSBkZl9jICU+JQogIG1lcmdlKGRmX2NfdGF4LCBieS54PTAsIGJ5Lnk9MCwgYWxsID0gVFJVRSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJSb3cubmFtZXMiKSAlPiUKICBtZXJnZShkZl9jX2NsciwgYnkueD0wLCBieS55PTApICU+JQogIGNvbHVtbl90b19yb3duYW1lcygiUm93Lm5hbWVzIikgCgojIGJ1aWxkIGxpc3Qgb2YgdmFsaWQgT1RVcyAod2l0aGluLWNsdXN0ZXIgcGFpcndpc2UgcmhvID4gY3V0b2ZmKQpvdHVfYyA8LSBjKCkKb3R1X2NfY2x1c3Rlcl9jb3VudHMgPC0gYygpCmZvciAoeCBpbiAxOk4pIHsKICBzdWJzZXRfYyA8LSByb3duYW1lcyhmaWx0ZXIoZGZfYywgY2x1c3RlciA9PSB4KSkKICBpZiAoIkFzSXMiICVpbiUgY2xhc3Moc3Vic2V0X2MpKSB7CiAgICBjbGFzcyhzdWJzZXRfYykgPC0gY2xhc3Moc3Vic2V0X2MpWy1tYXRjaCgiQXNJcyIsIGNsYXNzKHN1YnNldF9jKSldCiAgfQogICMgZ2V0IHBhaXJzIHdpdGggcmhvID4gY3V0b2ZmIEFORCBib3RoIG1lbWJlcnMgaW4gY2x1c3RlciBuCiAgcmVzX2MgPC0gZ2V0UmVzdWx0cyhwciwgCiAgICAgICAgICAgICBjdXRvZmYgPSBDVVRPRkYsICMgbWluaW11bSByaG8gdmFsdWUKICAgICAgICAgICAgIGluY2x1ZGUgPSBzdWJzZXRfYywKICAgICAgICAgICAgIG9yID0gRkFMU0UpCiAgIyBhcHBlbmQgdmFsaWQgT1RVcyAoYWNyb3NzIGJvdGggUGFydG5lciBhbmQgUGFpcikKICBvdHVfdW5pb24gPC0gdW5pb24ocmVzX2MkUGFydG5lciwgcmVzX2MkUGFpcikKICBvdHVfY19jbHVzdGVyX2NvdW50cyA8LSBjKG90dV9jX2NsdXN0ZXJfY291bnRzLCBsZW5ndGgob3R1X3VuaW9uKSkKICBvdHVfYyA8LSBjKG90dV9jLCBvdHVfdW5pb24pCn0KCiMgbmFtZSBjb3VudHMgb2YgdmFsaWQgT1RVcyBwZXIgY2x1c3RlcgpuYW1lcyhvdHVfY19jbHVzdGVyX2NvdW50cykgPC0gMTpOCiMgb25seSBrZWVwIHN1YnNldCBvZiB2YWxpZCBPVFVzCmRmX2MgPC0gZGZfY1tvdHVfYywgXQojIGRlLWluZGV4IE9UVSBjb2x1bW4KZGZfYyA8LSBjYmluZChPVFUgPSByb3duYW1lcyhkZl9jKSwgZGZfYykKcm93bmFtZXMoZGZfYykgPC0gMTpucm93KGRmX2MpCmRmX2MKYGBgCgpgYGB7cn0Kb3R1X2NfY2x1c3Rlcl9jb3VudHMKYGBgCmBgYHtyfQpsZW5ndGgodW5pcXVlKGRmX2Mka2luZ2RvbSkpCmxlbmd0aCh1bmlxdWUoZGZfYyRwaHlsdW0pKQpsZW5ndGgodW5pcXVlKGRmX2MkY2xhc3MpKQpsZW5ndGgodW5pcXVlKGRmX2Mkb3JkZXIpKQpsZW5ndGgodW5pcXVlKGRmX2MkZmFtaWx5KSkKbGVuZ3RoKHVuaXF1ZShkZl9jJGdlbnVzKSkKbGVuZ3RoKHVuaXF1ZShkZl9jJHNwZWNpZXMpKQpgYGAKCiMgU2F2ZSB0byAuY3N2CgpgYGB7cn0KIyBzYXZlCndyaXRlLmNzdihkZl9jLCBwYXN0ZShzYXZlX2xvY2F0aW9uLCAicHJvcHIuY3N2Iiwgc2VwPSIiKSwgcXVvdGUgPSBGQUxTRSkKYGBgCgoKIyMjIFBsb3QsIHg9dHAsIHJlYWwgZml0CgpgYGB7cn0KZGZfY19sb25nZXIgPC0gZGZfYyAlPiUKICAjIHBpdm90IGRhdGEgc28gZWFjaCByb3cgaGFzIHg9c2FtcGxlSUQsIHk9Y2xyCiAgcGl2b3RfbG9uZ2VyKHBoeWxvc2VxOjpzYW1wbGVfbmFtZXMocHNfY2xyKSwKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAic2FtcGxlSUQiLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiY2xyIikgJT4lCiAgIyBhZGQgdmFyaWFibGUgc2VyaWVzCiAgbXV0YXRlKHNlcmllcyA9IHNhbXBsZV9tZXRhW3NhbXBsZUlELCAic2VyaWVzIl0pICU+JQogICMgYWRkIHZhcmlhYmxlIGdyb3d0aC5waGFzZQogIG11dGF0ZShncm93dGgucGhhc2UgPSBzYW1wbGVfbWV0YVtzYW1wbGVJRCwgImdyb3d0aC5waGFzZSJdKSAlPiUKICAjIGFkZCB2YXJpYWJsZSB0cAogIG11dGF0ZSh0cCA9IHNhbXBsZV9tZXRhW3NhbXBsZUlELCAidHAiXSkgJT4lCiAgIyBhZGQgdmFyaWFibGUgdHBfb3JkZXIKICBtdXRhdGUodHBfb3JkZXIgPSBzYW1wbGVfbWV0YVtzYW1wbGVJRCwgInRwX29yZGVyIl0pCiMgZXN0YWJsaXNoIHRoYXQgdHAgaXMgYW4gb3JkZXJlZCBmYWN0b3IKZGZfY19sb25nZXIkdHAgPC0gZmFjdG9yKGRmX2NfbG9uZ2VyJHRwLCBsZXZlbHMgPSB1bmlxdWUoc2FtcGxlX21ldGEkdHApKQojIHJlb3JkZXIgZGF0YSBmcmFtZQpkZl9jX2xvbmdlciA8LSBkZl9jX2xvbmdlclt3aXRoKGRmX2NfbG9uZ2VyLCBvcmRlcih0cCkpLF0KZGZfY19sb25nZXIKYGBgCgpgYGB7cn0KIyBsaW5lIHBsb3QsIGZhY2V0ZWQgYnkgY2x1c3RlciwgY29sb3JlZCBieSB0YXhyYW5rCmRmX2NfbG9uZ2VyICU+JQogIGdncGxvdChhZXMoeD10cCwgeT1jbHIsIGdyb3VwPU9UVSwgY29sb3I9Z2VudXMpLCBhbHBoYT0wLjMpICsKICAgIGdlb21fbGluZSgpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9ICJDLTEtMDMiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAiQy0yLTAzIiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gIkctMS0wMyIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9ICJHLTItMDMiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAiRy0zLTAzIiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gIk0tMS0wMyIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9ICJNLTItMDMiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAiTS0zLTAzIiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSB0YWJsZWF1XzIwX2NvbG9ycykgKwogICAgZ3VpZGVzKGNvbG9yPWd1aWRlX2xlZ2VuZChuY29sPTIpKSArCiAgICB0aGVtZV9zZXQodGhlbWVfY2xhc3NpYygpKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEpKSArCiAgICBnZ3RpdGxlKCJhbGwiKSArCiAgICBmYWNldF93cmFwKCB+IGNsdXN0ZXIpCgojIGxpbmUgcGxvdCwgZmFjZXRlZCBieSBjbHVzdGVyLCBjb2xvcmVkIGJ5IHRheHJhbmsKZGZfY19sb25nZXIgJT4lCiAgZmlsdGVyKHNlcmllcyA9PSAiQyIpICU+JQogIGdncGxvdChhZXMoeD10cCwgeT1jbHIsIGdyb3VwPU9UVSwgY29sb3I9Z2VudXMpLCBhbHBoYT0wLjMpICsKICAgIGdlb21fbGluZSgpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9ICJDLTEtMDMiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAiQy0yLTAzIiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSB0YWJsZWF1XzIwX2NvbG9ycykgKwogICAgZ3VpZGVzKGNvbG9yPWd1aWRlX2xlZ2VuZChuY29sPTIpKSArCiAgICB0aGVtZV9zZXQodGhlbWVfY2xhc3NpYygpKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEpKSArCiAgICBnZ3RpdGxlKCJjZWxsdWxvc2Ugc2VyaWVzIikgKwogICAgZmFjZXRfd3JhcCggfiBjbHVzdGVyKQoKIyBsaW5lIHBsb3QsIGZhY2V0ZWQgYnkgY2x1c3RlciwgY29sb3JlZCBieSB0YXhyYW5rCmRmX2NfbG9uZ2VyICU+JQogIGZpbHRlcihzZXJpZXMgPT0gIkciKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dHAsIHk9Y2xyLCBncm91cD1PVFUsIGNvbG9yPWdlbnVzKSwgYWxwaGE9MC4zKSArCiAgICBnZW9tX2xpbmUoKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAiRy0xLTAzIiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gIkctMi0wMyIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9ICJHLTMtMDMiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IHRhYmxlYXVfMjBfY29sb3JzKSArCiAgICBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKG5jb2w9MikpICsKICAgIHRoZW1lX3NldCh0aGVtZV9jbGFzc2ljKCkpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSkpICsKICAgIGdndGl0bGUoImdsdWNvc2Ugc2VyaWVzIikgKwogICAgZmFjZXRfd3JhcCggfiBjbHVzdGVyKQoKIyBsaW5lIHBsb3QsIGZhY2V0ZWQgYnkgY2x1c3RlciwgY29sb3JlZCBieSB0YXhyYW5rCmRmX2NfbG9uZ2VyICU+JQogIGZpbHRlcihzZXJpZXMgPT0gIk0iKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dHAsIHk9Y2xyLCBncm91cD1PVFUsIGNvbG9yPWdlbnVzKSwgYWxwaGE9MC4zKSArCiAgICBnZW9tX2xpbmUoKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAiTS0xLTAzIiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gIk0tMi0wMyIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9ICJNLTMtMDMiLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IHRhYmxlYXVfMjBfY29sb3JzKSArCiAgICBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKG5jb2w9MikpICsKICAgIHRoZW1lX3NldCh0aGVtZV9jbGFzc2ljKCkpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSkpICsKICAgIGdndGl0bGUoIm1hbGF0ZSBzZXJpZXMiKSArCiAgICBmYWNldF93cmFwKCB+IGNsdXN0ZXIpCmBgYAoKIyMjIFBsb3QgKGdlbnVzKSwgeD10cF9vcmRlciwgbG9lc3MgbGluZSBvZiBiZXN0IGZpdAogKiBsZXNzIGphZ2dlZAogKiBsb2VzcyBsaW5lcyByZXF1aXJlIHhfYXhpcyB0byBiZSBjb250aW51b3VzCiAKCmBgYHtyfQp0cF9vcmRlcl9tYXAKYGBgCgpgYGB7cn0KY29sb3JfZ3Jvd3RoLnBoYXNlCmBgYAoKCmBgYHtyIGRwaSA9IDIwMH0KZGZfY19sb25nZXIgJT4lCiAgZ2dwbG90KGFlcyh4PXRwX29yZGVyLCB5PWNsciwgZ3JvdXA9T1RVLCBjb2xvcj1nZW51cyksIGFscGhhPTAuMykgKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSwgbHdkPTIuMCkgKwogICAgIyBnZW9tX3BvaW50KGFscGhhID0gMC4zKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyLCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG91cj1jb2xvcl9ncm93dGgucGhhc2VbIm1pZCBDOkMiXSkgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNywgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTAsIGxpbmV0eXBlID0gInNvbGlkIiwgY29sb3VyPWNvbG9yX2dyb3d0aC5waGFzZVsicGVydHVyYmVkIEciXSkgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTQsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDE4LCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyMiwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvdXI9Y29sb3JfZ3Jvd3RoLnBoYXNlWyJwZXJ0dXJiZWQgTSJdKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyNiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMzAsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gdGFibGVhdV8yMF9jb2xvcnMpICsKICAgIGd1aWRlcyhjb2xvcj1ndWlkZV9sZWdlbmQobmNvbD0xKSkgKwogICAgdGhlbWVfc2V0KHRoZW1lX2NsYXNzaWMoKSkgKwogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxKSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAibG9nMiByQUIiLAogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTcsIDcpLAogICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcz1jKC01LCAwLCA1KQogICAgICAgICAgICAgICAgICAgICAgICkgKwogICAgc2NhbGVfeF9kaXNjcmV0ZShuYW1lID0gInRpbWUgcG9pbnRzIiwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz11bmlxdWUoZGZfY19sb25nZXIkdHApKSArCiAgICBnZ3RpdGxlKCJhbGwiKSArCiAgICBmYWNldF93cmFwKCB+IGNsdXN0ZXIpCmBgYAoKCmBgYHtyfQpkZl9jX2xvbmdlciAlPiUKICBmaWx0ZXIoc2VyaWVzID09ICJDIikgJT4lCiAgZ2dwbG90KGFlcyh4PXRwX29yZGVyLCB5PWNsciwgZ3JvdXA9T1RVLCBjb2xvcj1nZW51cyksIGFscGhhPTAuMykgKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMiwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvdXI9Y29sb3JfZ3Jvd3RoLnBoYXNlWyJtaWQgQzpDIl0pICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDcsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gdGFibGVhdV8yMF9jb2xvcnMpICsKICAgIGd1aWRlcyhjb2xvcj1ndWlkZV9sZWdlbmQobmNvbD0yKSkgKwogICAgdGhlbWVfc2V0KHRoZW1lX2NsYXNzaWMoKSkgKwogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxKSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAibG9nMiByQUIiLAogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTcsIDcpLAogICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcz1jKC01LCAwLCA1KQogICAgICAgICAgICAgICAgICAgICAgICkgKwogICAgc2NhbGVfeF9kaXNjcmV0ZShuYW1lID0gInRpbWUgcG9pbnRzIiwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz0xOjEwLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHM9bmFtZXModHBfb3JkZXJfbWFwKVsxOjEwXSkgKwogICAgZ2d0aXRsZSgiY2VsbHVsb3NlIHNlcmllcyIpICsKICAgIGZhY2V0X3dyYXAoIH4gY2x1c3RlcikKCmRmX2NfbG9uZ2VyICU+JQogIGZpbHRlcihzZXJpZXMgPT0gIkciKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dHBfb3JkZXIsIHk9Y2xyLCBncm91cD1PVFUsIGNvbG9yPWdlbnVzKSwgYWxwaGE9MC4zKSArCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxMCwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTQsIGxpbmV0eXBlID0gInNvbGlkIiwgY29sb3VyPWNvbG9yX2dyb3d0aC5waGFzZVsibWlkIEM6QyJdKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxOCwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSB0YWJsZWF1XzIwX2NvbG9ycykgKwogICAgZ3VpZGVzKGNvbG9yPWd1aWRlX2xlZ2VuZChuY29sPTIpKSArCiAgICB0aGVtZV9zZXQodGhlbWVfY2xhc3NpYygpKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEpKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJsb2cyIHJBQiIsCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtNywgNyksCiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzPWMoLTUsIDAsIDUpCiAgICAgICAgICAgICAgICAgICAgICAgKSArCiAgICBzY2FsZV94X2Rpc2NyZXRlKG5hbWUgPSAidGltZSBwb2ludHMiLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzPTExOjIxLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHM9bmFtZXModHBfb3JkZXJfbWFwKVsxMToyMV0pICsKICAgIGdndGl0bGUoImdsdWNvc2Ugc2VyaWVzIikgKwogICAgZmFjZXRfd3JhcCggfiBjbHVzdGVyKQoKZGZfY19sb25nZXIgJT4lCiAgZmlsdGVyKHNlcmllcyA9PSAiTSIpICU+JQogIGdncGxvdChhZXMoeD10cF9vcmRlciwgeT1jbHIsIGdyb3VwPU9UVSwgY29sb3I9Z2VudXMpLCBhbHBoYT0wLjMpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIyLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyNiwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvdXI9Y29sb3JfZ3Jvd3RoLnBoYXNlWyJtaWQgQzpDIl0pICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDMwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IHRhYmxlYXVfMjBfY29sb3JzKSArCiAgICBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKG5jb2w9MikpICsKICAgIHRoZW1lX3NldCh0aGVtZV9jbGFzc2ljKCkpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSkpICsKICAgIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gImxvZzIgckFCIiwKICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC03LCA3KSwKICAgICAgICAgICAgICAgICAgICAgICBicmVha3M9YygtNSwgMCwgNSkKICAgICAgICAgICAgICAgICAgICAgICApICsKICAgIHNjYWxlX3hfZGlzY3JldGUobmFtZSA9ICJ0aW1lIHBvaW50cyIsIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHM9MjI6MzMsCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1uYW1lcyh0cF9vcmRlcl9tYXApWzIyOjMzXSkgKwogICAgZ2d0aXRsZSgibWFsYXRlIHNlcmllcyIpICsKICAgIGZhY2V0X3dyYXAoIH4gY2x1c3RlcikKYGBgCgoKIyMjIFBsb3QgKGZhbWlseSkgeD10cF9vcmRlciwgbG9lc3MgbGluZSBvZiBiZXN0IGZpdAogCmBgYHtyfQpkZl9jX2xvbmdlciAlPiUKICBnZ3Bsb3QoYWVzKHg9dHBfb3JkZXIsIHk9Y2xyLCBncm91cD1PVFUsIGNvbG9yPWZhbWlseSksIGFscGhhPTAuMykgKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNywgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTAsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDE0LCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxOCwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMjIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDI2LCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAzMCwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSB0YWJsZWF1XzIwX2NvbG9ycykgKwogICAgZ3VpZGVzKGNvbG9yPWd1aWRlX2xlZ2VuZChuY29sPTIpKSArCiAgICB0aGVtZV9zZXQodGhlbWVfY2xhc3NpYygpKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEpKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJsb2cyIHJBQiIsIGJyZWFrcz1jKDAsIDUsIDEwKSkgKwogICAgc2NhbGVfeF9kaXNjcmV0ZShuYW1lID0gInRpbWUgcG9pbnRzIiwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz11bmlxdWUoZGZfY19sb25nZXIkdHApKSArCiAgICBnZ3RpdGxlKCJhbGwiKSArCiAgICBmYWNldF93cmFwKCB+IGNsdXN0ZXIpCgpkZl9jX2xvbmdlciAlPiUKICBmaWx0ZXIoc2VyaWVzID09ICJDIikgJT4lCiAgZ2dwbG90KGFlcyh4PXRwX29yZGVyLCB5PWNsciwgZ3JvdXA9T1RVLCBjb2xvcj1mYW1pbHkpLCBhbHBoYT0wLjMpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDcsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gdGFibGVhdV8yMF9jb2xvcnMpICsKICAgIGd1aWRlcyhjb2xvcj1ndWlkZV9sZWdlbmQobmNvbD0yKSkgKwogICAgdGhlbWVfc2V0KHRoZW1lX2NsYXNzaWMoKSkgKwogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxKSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAibG9nMiByQUIiLCBicmVha3M9YygwLCA1LCAxMCkpICsKICAgIHNjYWxlX3hfZGlzY3JldGUobmFtZSA9ICJ0aW1lIHBvaW50cyIsIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHM9MToxMCwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPW5hbWVzKHRwX29yZGVyX21hcClbMToxMF0pICsKICAgIGdndGl0bGUoImNlbGx1bG9zZSBzZXJpZXMiKSArCiAgICBmYWNldF93cmFwKCB+IGNsdXN0ZXIpCgpkZl9jX2xvbmdlciAlPiUKICBmaWx0ZXIoc2VyaWVzID09ICJHIikgJT4lCiAgZ2dwbG90KGFlcyh4PXRwX29yZGVyLCB5PWNsciwgZ3JvdXA9T1RVLCBjb2xvcj1mYW1pbHkpLCBhbHBoYT0wLjMpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxNCwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTgsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gdGFibGVhdV8yMF9jb2xvcnMpICsKICAgIGd1aWRlcyhjb2xvcj1ndWlkZV9sZWdlbmQobmNvbD0yKSkgKwogICAgdGhlbWVfc2V0KHRoZW1lX2NsYXNzaWMoKSkgKwogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxKSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAibG9nMiByQUIiLCBicmVha3M9YygwLCA1LCAxMCkpICsKICAgIHNjYWxlX3hfZGlzY3JldGUobmFtZSA9ICJ0aW1lIHBvaW50cyIsIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHM9MTE6MjEsCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1uYW1lcyh0cF9vcmRlcl9tYXApWzExOjIxXSkgKwogICAgZ2d0aXRsZSgiZ2x1Y29zZSBzZXJpZXMiKSArCiAgICBmYWNldF93cmFwKCB+IGNsdXN0ZXIpCgpkZl9jX2xvbmdlciAlPiUKICBmaWx0ZXIoc2VyaWVzID09ICJNIikgJT4lCiAgZ2dwbG90KGFlcyh4PXRwX29yZGVyLCB5PWNsciwgZ3JvdXA9T1RVLCBjb2xvcj1mYW1pbHkpLCBhbHBoYT0wLjMpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIyLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyNiwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMzAsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gdGFibGVhdV8yMF9jb2xvcnMpICsKICAgIGd1aWRlcyhjb2xvcj1ndWlkZV9sZWdlbmQobmNvbD0yKSkgKwogICAgdGhlbWVfc2V0KHRoZW1lX2NsYXNzaWMoKSkgKwogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxKSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAibG9nMiByQUIiLCBicmVha3M9YygwLCA1LCAxMCkpICsKICAgIHNjYWxlX3hfZGlzY3JldGUobmFtZSA9ICJ0aW1lIHBvaW50cyIsIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHM9MjI6MzMsCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1uYW1lcyh0cF9vcmRlcl9tYXApWzIyOjMzXSkgKwogICAgZ2d0aXRsZSgibWFsYXRlIHNlcmllcyIpICsKICAgIGZhY2V0X3dyYXAoIH4gY2x1c3RlcikKYGBgCgojIyMgUGxvdCBjb3JyIHBlciB0cmFuc2ZlcgoqIFBsb3QgZWFjaCBwcmV2IGRheSArIHRyYW5zZmVyIHNlcGFyYXRlbHkKKiBGYWNldCBieSBjbHVzdGVyCgpQbG90czoKQTogQzBDIC0gQzEKQjogQzEtMjAgLSBDMQoKQzogQzBDIC0gRzEKRDogRzEtMTAgLSBHMgpFOiBHMi0xMCAtIEczCgpGOiBDMEMgLSBNMQpHOiBNMS0xMCAtIE0yCkg6IE0yLTEwIC0gTTMKCmBgYHtyfQp1bmlxdWUoc2FtcGxlX21ldGEkdHApCmBgYAoKYGBge3J9CnNhbXBsZV9tZXRhJHRyYW5zZmVyCmBgYAoKCmBgYHtyfQojIG5ldyBkYXRhIGZyYW1lCmRmX2RfbG9uZ2VyIDwtIGRmX2MgJT4lCiAgIyBwaXZvdCBkYXRhIHNvIGVhY2ggcm93IGhhcyB4PXNhbXBsZUlELCB5PWNscgogIHBpdm90X2xvbmdlcihwaHlsb3NlcTo6c2FtcGxlX25hbWVzKHBzX2NsciksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInNhbXBsZUlEIiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gImNsciIpICU+JQogICMgYWRkIHZhcmlhYmxlIHRyYW5zZmVyCiAgbXV0YXRlKHRyYW5zZmVyID0gc2FtcGxlX21ldGFbc2FtcGxlSUQsICJ0cmFuc2ZlciJdKSAlPiUKICAjIGFkZCB2YXJpYWJsZSB0cAogIG11dGF0ZSh0cCA9IHNhbXBsZV9tZXRhW3NhbXBsZUlELCAidHAiXSkKIyBlc3RhYmxpc2ggdGhhdCB0cCBpcyBhbiBvcmRlcmVkIGZhY3RvcgpkZl9kX2xvbmdlciR0cCA8LSBmYWN0b3IoZGZfZF9sb25nZXIkdHAsIGxldmVscyA9IHVuaXF1ZShzYW1wbGVfbWV0YSR0cCkpCiMgcmVvcmRlciBkYXRhIGZyYW1lCmRmX2RfbG9uZ2VyIDwtIGRmX2RfbG9uZ2VyW3dpdGgoZGZfZF9sb25nZXIsIG9yZGVyKHRwKSksXQpkZl9kX2xvbmdlcgpgYGAKYGBge3J9CnBsb3RfY29ycl9wZXJfdHJhbnNmZXIgPC0gZnVuY3Rpb24oZGZfZF9sb25nZXIsIHRwX29yZGVyX21hcCwgdGl0bGUsIGxlZ2VuZF9wb3M9InJpZ2h0IikgewogIGRmX2RfbG9uZ2VyICU+JQogICMgZmlsdGVyIGRhdGEKICBmaWx0ZXIodHAgJWluJSBuYW1lcyh0cF9vcmRlcl9tYXApKSAlPiUKICAjIG51bWVyaWNhbCBvcmRlcmVkIHgtYXhpcwogIG11dGF0ZSh0cF9vcmRlciA9IHRwX29yZGVyX21hcFthcy5jaGFyYWN0ZXIodHApXSkgJT4lCiAgIyBwbG90CiAgZ2dwbG90KGFlcyh4PXRwX29yZGVyLCB5PWNsciwgZ3JvdXA9T1RVLCBjb2xvcj1nZW51cyksIGFscGhhPTAuMykgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIsIGxpbmV0eXBlID0gImRvdHRlZCIsIGFscGhhPTAuMykgKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gNSwgbGluZXR5cGUgPSAiZG90dGVkIiwgYWxwaGE9MC4zKSArCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBhbHBoYT0wLjMpICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC01LCBsaW5ldHlwZSA9ICJkb3R0ZWQiLCBhbHBoYT0wLjMpICsKICAgIHRoZW1lX3NldCh0aGVtZV9jbGFzc2ljKCkpICsKICAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gdGFibGVhdV8yMF9jb2xvcnMpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSksCiAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBsZWdlbmRfcG9zKSArCiAgICBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKG5jb2w9MikpICsKICAgIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gImxvZzIgckFCIiwKICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC03LCA3KSwKICAgICAgICAgICAgICAgICAgICAgICBicmVha3M9YygtNSwgMCwgNSkpICsKICAgICMgeC1heGlzIGxhYmVsaW5nCiAgICBzY2FsZV94X2Rpc2NyZXRlKG5hbWUgPSAidGltZSBwb2ludHMiLAogICAgICAgICAgICAgICAgICAgICBsaW1pdHM9MTpsZW5ndGgodHBfb3JkZXJfbWFwKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPW5hbWVzKHRwX29yZGVyX21hcCkpICsKICAgIGZhY2V0X3dyYXAoIH4gY2x1c3RlcikgKwogICAgZ2d0aXRsZSh0aXRsZSkKfQpgYGAKCmBgYHtyfQp1bmlxdWUoZGZfZF9sb25nZXIkdHApCmBgYAoKCmBgYHtyfQojIDFDCnBsb3RfY29ycl9wZXJfdHJhbnNmZXIoZGZfZF9sb25nZXIsCiAgICAgICAgICAgICAgICAgICAgICAgdHBfb3JkZXJfbWFwID0gYygKICAgICAgICAgICAgICAgICAgICAgICAgICJDLTAtMTAiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICJDLTEtMDMiID0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICJDLTEtMDUiID0gMywKICAgICAgICAgICAgICAgICAgICAgICAgICJDLTEtMDciID0gNCwKICAgICAgICAgICAgICAgICAgICAgICAgICJDLTEtMTAiID0gNSwKICAgICAgICAgICAgICAgICAgICAgICAgICJDLTEtMjAiID0gNiksCiAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiZmlyc3QgdHJhbnNmZXIgb250byBjZWxsdWxvc2UgKDFDKSIpCmBgYAoKYGBge3J9CiMgMkMKcGxvdF9jb3JyX3Blcl90cmFuc2ZlcihkZl9kX2xvbmdlciwKICAgICAgICAgICAgICAgICAgICAgICB0cF9vcmRlcl9tYXAgPSBjKAogICAgICAgICAgICAgICAgICAgICAgICAgIkMtMS0yMCIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgIkMtMi0wMyIgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgIkMtMi0wNSIgPSAzLAogICAgICAgICAgICAgICAgICAgICAgICAgIkMtMi0xMCIgPSA0KSwKICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJzZWNvbmQgdHJhbnNmZXIgb250byBjZWxsdWxvc2UgKDJDKSIpCmBgYAoKCmBgYHtyfQojIDFHCnBsb3RfY29ycl9wZXJfdHJhbnNmZXIoZGZfZF9sb25nZXIsCiAgICAgICAgICAgICAgICAgICAgICAgdHBfb3JkZXJfbWFwID0gYygKICAgICAgICAgICAgICAgICAgICAgICAgICJDLTAtMTAiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICJHLTEtMDMiID0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICJHLTEtMDUiID0gMywKICAgICAgICAgICAgICAgICAgICAgICAgICJHLTEtMDciID0gNCwKICAgICAgICAgICAgICAgICAgICAgICAgICJHLTEtMTAiID0gNSksCiAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAicGVydHVyYmF0aW9uIHRyYW5zZmVyIG9udG8gZ2x1Y29zZSAoMUcpIikKYGBgCgoKYGBge3J9CiMgMkcKcGxvdF9jb3JyX3Blcl90cmFuc2ZlcihkZl9kX2xvbmdlciwKICAgICAgICAgICAgICAgICAgICAgICB0cF9vcmRlcl9tYXAgPSBjKAogICAgICAgICAgICAgICAgICAgICAgICAgIkctMS0xMCIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgIkctMi0wMyIgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgIkctMi0wNSIgPSAzLAogICAgICAgICAgICAgICAgICAgICAgICAgIkctMi0wNyIgPSA0LAogICAgICAgICAgICAgICAgICAgICAgICAgIkctMi0xMCIgPSA1KSwKICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJmaXJzdCB0cmFuc2ZlciBiYWNrIG9udG8gY2VsbHVsb3NlICgyRykiKQpgYGAKCgpgYGB7cn0KIyAzRwpwbG90X2NvcnJfcGVyX3RyYW5zZmVyKGRmX2RfbG9uZ2VyLAogICAgICAgICAgICAgICAgICAgICAgIHRwX29yZGVyX21hcCA9IGMoCiAgICAgICAgICAgICAgICAgICAgICAgICAiRy0yLTEwIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAiRy0zLTAzIiA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiRy0zLTA1IiA9IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAiRy0zLTA3IiA9IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAiRy0zLTEwIiA9IDUpLAogICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gInNlY29uZCB0cmFuc2ZlciBiYWNrIG9udG8gY2VsbHVsb3NlICgzRykiKQpgYGAKCgpgYGB7cn0KIyAxTQpwbG90X2NvcnJfcGVyX3RyYW5zZmVyKGRmX2RfbG9uZ2VyLAogICAgICAgICAgICAgICAgICAgICAgIHRwX29yZGVyX21hcCA9IGMoCiAgICAgICAgICAgICAgICAgICAgICAgICAiQy0wLTEwIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAiTS0xLTAzIiA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiTS0xLTA1IiA9IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAiTS0xLTA3IiA9IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAiTS0xLTEwIiA9IDUpLAogICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gInBlcnR1cmJhdGlvbiB0cmFuc2ZlciBvbnRvIG1hbGF0ZSAoMU0pIikKYGBgCgoKYGBge3J9CiMgMk0KcGxvdF9jb3JyX3Blcl90cmFuc2ZlcihkZl9kX2xvbmdlciwKICAgICAgICAgICAgICAgICAgICAgICB0cF9vcmRlcl9tYXAgPSBjKAogICAgICAgICAgICAgICAgICAgICAgICAgIk0tMS0xMCIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgIk0tMi0wMyIgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgIk0tMi0wNSIgPSAzLAogICAgICAgICAgICAgICAgICAgICAgICAgIk0tMi0wNyIgPSA0LAogICAgICAgICAgICAgICAgICAgICAgICAgIk0tMi0xMCIgPSA1KSwKICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJmaXJzdCB0cmFuc2ZlciBiYWNrIG9udG8gY2VsbHVsb3NlICgyTSkiKQpgYGAKCgpgYGB7cn0KIyAzTQpwbG90X2NvcnJfcGVyX3RyYW5zZmVyKGRmX2RfbG9uZ2VyLAogICAgICAgICAgICAgICAgICAgICAgIHRwX29yZGVyX21hcCA9IGMoCiAgICAgICAgICAgICAgICAgICAgICAgICAiTS0yLTEwIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAiTS0zLTAzIiA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiTS0zLTA1IiA9IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAiTS0zLTA3IiA9IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAiTS0zLTEwIiA9IDUpLAogICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gInNlY29uZCB0cmFuc2ZlciBiYWNrIG9udG8gY2VsbHVsb3NlICgzTSkiKQoKYGBgCgoKCg==